为什么我没有看到IDisposable实现并发的任何实现?

问题描述 投票:16回答:5

当我浏览IDisposable的示例实现时,没有发现任何线程安全的。为什么出于线程安全原因未实现IDisposable? (相反,调用者有责任确保仅单个线程调用Dispose())。

c# thread-safety idisposable
5个回答
30
投票

在完成处理之前,请勿丢弃任何物体。如果还有其他线程在引用该对象,并且有可能他们可能要调用其方法,则不应丢弃它。


6
投票

线程安全的Dispose模式的唯一真正的好处是,如果跨线程滥用,您可以保证获得ObjectDisposedException而不是潜在的不可预知的行为。注意,这意味着该模式需要的不仅仅是线程安全的Dispose。它要求所有不依赖于Dispose的类的方法都不能与Disposal机制互锁。



1
投票

我不确定为什么Microsoft不在非虚拟处理方法中使用互锁的处理标志(目的是终结器(如果有)应使用相同的标志)。多个线程可能尝试处置对象的情况很少见,但并非禁止这种情况。例如,它可能发生在本应执行一些异步任务并自行清理的对象上,但可以在必要时将其杀死。对象处置不应该经常发生,以免Interlocked.Exchange具有任何有意义的性能成本。


0
投票

因为它们是错误的和懒惰的,通常被认为是“边际案例”或“不值得的开销”。

© www.soinside.com 2019 - 2024. All rights reserved.