我在.net 2.0中有应用程序,我在我的应用程序中全局拥有一个DataTable对象,并在整个应用程序中拥有不同的数据视图。
当执行一个动作时,我创建了许多线程,让我们说5从不同的数据视图中读取数据,同时2/3个线程正在读取数据(并非所有2个以上的数据都读取数据),一个线程在数据表中写入数据。因此我们得到“枚举更新”或“参数非空”类型等异常。
我已经使用了ReadWriteLock,但是在ReaderWriterLock.AcquireWriterLock()上找不到运气。
我不明白我在哪里做错了。
如果有人有任何想法。请帮助我如何为数据表和数据视图的场景实现ReaderWriterLock。
谢谢!
答案 0 :(得分:0)
首先,this MSDN article可能会有所帮助。 Jeffrey Richter谈论的图书馆可用here。
由于应用程序是在.Net 2.0中开发的,我建议使用自定义的ReaderWriterLock,它更喜欢作者而不是读者。此外,如果您正在寻找一些源代码,那么this guy可能对您有所帮助。自定义ReaderWriterLock之一,他写道:
public sealed class ReaderWriterLock
{
int readers = 0;
int writers = 0;
public void AcquireReaderLock()
{
Thread.BeginCriticalRegion();
while (true)
{
if (Thread.VolatileRead(ref writers) == 0)
{
Interlocked.Increment(ref readers);
if (Thread.VolatileRead(ref writers) == 0)
{
return;
}
else
{
Interlocked.Decrement(ref readers);
}
}
Thread.Sleep(1);
}
}
public void ReleaseReaderLock()
{
Interlocked.Decrement(ref readers);
Thread.EndCriticalRegion();
}
public void AcquireWriterLock()
{
Thread.BeginCriticalRegion();
while (Interlocked.CompareExchange(ref writers, 1, 0) != 0)
{
Thread.Sleep(1);
}
while (Thread.VolatileRead(ref readers) != 0)
{
Thread.Sleep(1);
}
}
public void ReleaseWriterLock()
{
Thread.VolatileWrite(ref writers, 0);
Thread.EndCriticalRegion();
}
}
关键点: