我有一个MyClass类。这个类有一个字段:public ReaderWriterLockSlim rw; (对于更简单的示例代码,它是公共的)。许多线程可以使用rw.EnterReadLock等从MyClass读取数据。
我还实现了IDisposable接口:
private void Dispose (bool pDisposing)
{
{
if (pDisposing) // release managed resources
{
if (rw != null)
{
rwLockSlim.Dispose ();
rwLockSlim = null;
}
}
//--- release unmanaged resources
// some code...
isDisposed = true; // ...
}
}如你所见,当第二个线程在myClass对象上调用Dispose时,当一个线程正在使用MyClass时,问题是。我不能处理ReaderWriterLockSlim,因为它会使我的应用程序崩溃。那么我应该只删除释放托管资源行吗?无论如何,ReaderWriterLockSlim将在不久的将来由GC收集,对吗?(但是这个类的资源是否很昂贵?)
也许我应该在Dispose方法中添加一些锁(SyncObject)或者别的什么?
编辑:我还处理AllocHGlobal,所以我需要等待,直到所有线程停止对myClass的读/写。
不同的观点:
public MyClass : IDisposable
{
public void EnterReadLock (); // calls rwLockSlim.EnterReadLock,
// if object is disposed throws Exception
public void ExitReadLock (); // same as above
public void Dispose (); // wait until all threads exit from locks,
// frees unamanged resources, mark class as disposed
}发布于 2013-02-03 19:09:40
这可能不是最好的答案,而是观察和一些想法。
你能简化你的代码吗?我的意思是,其他类型不应该关心你的类型在特定的并发条件下是否抛出异常。您将如何测试此功能?公共锁对象是邪恶的。它必须是私有的,除非你想花几个月的时间来找出神秘的bug。
如果调用dispose方法,则意味着任何其他对象都不应使用此对象。这意味着在调用dispose方法之前,必须首先确保所有线程都完成了对对象的操作。
建议
静态锁使锁私有并确保所有线程都已完成,在调用dispose之前使用静态锁object
https://stackoverflow.com/questions/14671564
复制相似问题