Nol*_*rin 9 .net dispose idisposable thread-safety
MSDN很好地记录了BCL类型实例成员的线程安全性,但是我从未真正看到过指示如何调用类型Dispose方法的信息IDisposable.
在Dispose一)保证方法是线程安全的所有类,B)从来没有保证是线程安全的,C)保证是线程安全的一些类(如果是这样,这哪里是专门记录)?
最后,如果Dispose保证方法是线程安全的,那是否意味着我必须在使用可支配资源的类中围绕每个实例方法进行锁定?
要点:我知道类型的终结器应该是线程安全的,因为垃圾收集在.NET中的工作方式(非常积极),并且它们可能会调用该Dispose方法.但是,让我们暂时搁置这个问题.
线程安全和Dispose的问题有点棘手.因为在很多情况下,任何一个线程开始处理对象时,任何线程都可以合法地对某个对象进行处理是尝试自己处理它,它会乍一看似乎是确保线程安全的唯一必要条件.在'dispos'标志上使用Interlocked.Exchange以确保一个线程的Dispose尝试发生,另一个被静默忽略.实际上,这是一个很好的起点,我认为它应该是标准Dispose模式的一部分(CompareExchange应该在密封的基类包装器方法中完成,以避免每个派生类都需要使用它自己的私有处置国旗).不幸的是,如果考虑到Dispose实际上做了什么,事情要复杂得多.
Dispose的真正目的不是对被处理的对象做某事,而是清理该对象持有引用的其他实体.这些实体可以是托管对象,系统对象或其他完全不同的东西; 它们甚至可能与处理的物体不在同一台计算机上.为了使Dispose成为线程安全的,那些其他实体将允许Dispose在其他线程可能正在对其进行其他操作的同时清理它们.有些对象可以处理这种用法; 别人不能.
一个特别令人烦恼的例子:允许对象使用不是线程安全的RemoveHandler方法的事件.因此,任何清理事件处理程序的Dispose方法只能从与创建订阅的线程相同的线程中调用.