【发布时间】:2010-09-23 14:44:39
【问题描述】:
我有一个类似这样的 API 库:
public class Library : IDisposable
{
public Library(Action callback);
public string Query();
public void Dispose();
}
在我实例化库之后,它可能随时在任何线程上调用我传递给它的回调。该回调需要调用 Query 来完成有用的工作。库只会在释放后停止调用我的回调,但如果回调在主线程调用 Dispose 后尝试调用 Query,则会发生坏事。
我确实希望允许回调同时在多个线程上运行。没关系。但是我们需要确保调用 Dispose 时不会运行任何回调。我认为 ReaderWriterLockSlim 可能是合适的——你需要写锁来调用 Dispose,而回调需要读锁来调用 Query。这里的问题是 ReaderWriterLockSlim 是 IDisposable,我认为处置它永远不会安全 - 我永远不知道没有一个回调在飞行中根本没有达到获取读取的地步 -还没有锁定。
我该怎么办?看起来 ReaderWriterLock 不是 IDisposable,但它自己的文档说您应该改用 ReaderWriterLockSlim。我可以尝试只用“lock”关键字做一些等效的事情,但这听起来很浪费而且很容易搞砸。
PS - 如果您认为是这种情况,请随意说库 API 不好。我个人更喜欢它保证 Dispose 会阻塞,直到所有回调完成。
【问题讨论】:
-
lib API 是否包含 IsDisposed 属性?
-
不,我不这么认为。不过,我不确定它会有什么帮助。需要详细说明吗?
标签: c# multithreading thread-safety