我正在创建一个类,比如 LockHolder,以简化需要逻辑的锁。它实现了 IDisposable 接口,因此我可以像这样使用它:
using(LockHolderCreater.Create(lockObject, waittime))
{
//do something
}
LockHolder 的 Dispose 方法释放 lockObject(通过 Monitor.Exit)如果已获得(通过 Monitor.TryEnter)。如果我每次调用 LockHolderCreater.Create 时都创建一个新的 LockHolder 对象,那效果很好,但这会创建太多的 LockHolder 实例。所以我写了 LockHolderCreater 来维护一个 LockHolder 对象的列表,以便重用它们。现在我也面临着问题:
首先,在调试时,我发现在输出窗口中有很多诸如“System.dll 中发生'System.ObjectDisposedException' 类型的第一次机会异常”这样的消息。如果“using”语句所做的只是调用Dispose方法,我可以防止这种异常吗?
其次,更重要的是,如果我重用 LockerHolder 实例,在我的应用程序启动后的某个早期时间,当我尝试在 Dispose 方法中释放锁时会抛出 SynchronizationLockException 异常,说“对象同步方法是从不同步的代码块。”。我检查了我的逻辑,但我认为两个线程不可能同时使用一个 LockHolder 实例。这可能与上面提到的 ObjectDisposedException 有关吗?
关于答案
我没有得到我的问题的直接答案,但 Marc Gravell 的回答使它变得不那么必要了。