为了有条件地在所有主要公开方法的开头抛出ObjectDisposedException,跟踪其他线程安全类型上的经典bool disposed字段有什么意义吗?
我在网上的一些地方看到过这个模式的推荐,但我不确定作者是否正确地使用了它,所以这个问题假设他们是正确的。
在这种情况下,确保锁条件在条件求值之外为真的唯一方法似乎是在每个公开成员的整个主体上使用同步机制,例如disposed (),包括Dispose(bool)方法。这不是会使类型再次成为有效的单线程吗?
如果这是真的,那么使用它就没有意义了,因此你不能在一些IDisposable实现中依赖ObjectDisposedException机制-那么如果没有必要的话,我们为什么还要使用这种机制呢?
====
我猜IDisposable和ObjectDisposedException只是不适合线程安全的类型。
发布于 2010-02-12 02:39:18
也许使线程安全对象在方法运行时不被释放的更有效的方法是使用ReaderWriterLockSlim。让所有的公共方法在执行时获得一个读锁,并在执行完成后释放它。让Dispose获取编写器锁。它将等待所有其他方法完成后,才会获得写锁。然后,它在它独占持有的写锁中设置isDisposed。在Dispose完成之后,对公共方法的任何调用都可以看到isDisposed并抛出ObjectDisposedException。
ReaderWriterLockSlim
http://msdn.microsoft.com/en-us/library/system.threading.readerwriterlockslim.aspx
发布于 2010-02-12 03:14:44
如果你的对象已经被释放了,那么它的行为会有所不同,如果它很可能会在被释放后被使用,那么你需要对此进行跟踪。抛出ObjectDisposedException比抛出任何随机的异常要好得多,因为如果对象已经被释放,而你没有事先检查,就会抛出任何随机的异常。
发布于 2010-08-19 16:35:43
考虑到" Disposed“布尔值只在一个地方更新,并且在调用Disposed之后使用该对象是调用者的一个bug。
我认为在调用Dispose之后“大多数时候”抛出ObjectDisposedException就足够了。我认为ObjectDisposedException是一个调试助手,而不是调用者应该捕捉的东西。
https://stackoverflow.com/questions/2246678
复制相似问题