2013-01-10 117 views
0

有什么方法可以将事件添加到线程结束时执行的当前线程中。我可以在当前线程上添加关闭事件吗

我有一个解决方案,我们创建了我们想要重用但仍然需要在线程结束时处理以防止泄漏的资源,我不能相信每个人都会勤奋地为其代码添加手动处置调用。

我可以用线程的包装来做到这一点,但这不会是一个可靠的解决方案,因为我不能100%确定每个人都会使用包装,有时可能需要将其添加到现有线。

所以我需要我的资源能够添加一个处理事件,当胎面结束时被调用。

这是可能在C#中

+0

看看这个问题http://stackoverflow.com/questions/5551258/c-net-how-to-alert-program-that-the-thread-is-finished-event-driven –

+2

*我不能相信每一个一个人会勤奋地为他们的代码添加手动处理调用。* - 那么为什么你相信他们在.NET中调用处理任何其他实现'IDisposable'的对象呢? – Rotem

+0

@Rotem,我没有,我只是试图改善我的情况,并正在寻找选项:/ –

回答

0

我们大家都在谈论相同的.net在这里?只是impliment Finalize

http://msdn.microsoft.com/en-us/library/b1yfkh5e(v=vs.100).aspx

http://msdn.microsoft.com/en-us/library/66x5fx1b.aspx

这是告诉 'GC' 清除资源时做一些额外的操作方式。

+0

问题在于,可能会出现这样的情况:对象可能需要一段时间才会熄灭的范围导致资源挂到很久:(,希望线程结束时会立即发生一些事情 –

+0

我将这个命名为答案,因为finalize解决方案可能会改进我的解决方案,我不知道Dispose不是由GC调用的,这可能是我见过的一些问题的原因,尽管在我可以花费数月时间确保:/ –

+0

Dispose是一个很好的名字,可以告诉用户该类可能有非托管数据要发布。 – Nahum

0

有没有办法将事件添加到当线程结束时执行当前线程?

不,在框架中没有可以订阅的事件。

正如你所说,一种解决方案是将线程主方法封装为try/finally块。


另一个解决方案是依靠GC。如果有人忘记调用Dispose,那么在对象超出范围之后,析构函数仍然会被调用 - 但它会在终结器线程上调用。

+0

“析构函数仍然会在对象超出范围时调用”当GC启动时它会被调用它可能在对象超出范围之后的某段时间。这是我们拥有Dispose模式的全部原因。 –

+0

@MartinBrown绝对 - 我澄清了我的答案。 –

+0

这就是今天当某人以错误的方式使用资源时它的工作原理。我只是想以任何方式解决一些开发人员的错误:/但我必须解决的问题是关注资源使用情况并尝试查找任何泄漏。 –

0

如果您希望开发人员可能忘记在对象上调用Dispose(),还有另一种模式可用于强制他们调用此类方法。这受到数据库事务如何工作的启发。

这个想法是你使用暴露两种方法的对象。 Complete()RollBack()。在对象使用期限结束时,开发人员需要致电Complete()才能使用。如果他不服从,物体的析构函数(或Dispose())将会调用RollBack()。在.NET TransactionScope类是一个很好的例子。

在你的情况下,你需要将你的线程对象封装在这个类中。调用者不直接处理线程对象,但它处理这个类对象。

+0

在这种情况下,我将无法强制使用围绕线程的包装:( –

+0

@DavidMårtensson调用者如何调用线程?由线程执行的方法属于哪一组类? – Ankush

+0

在这种情况下,它可能处于这是我们许多内部解决方案共享数据的一个模块,不幸的是,我无法控制使用情况。 –

相关问题