同步数据表/数据视图以进行读写

时间:2010-05-04 15:10:39

标签: .net datatable dataview readerwriterlock

我在.net 2.0中有应用程序,我在我的应用程序中全局拥有一个DataTable对象,并在整个应用程序中拥有不同的数据视图。

当执行一个动作时,我创建了许多线程,让我们说5从不同的数据视图中读取数据,同时2/3个线程正在读取数据(并非所有2个以上的数据都读取数据),一个线程在数据表中写入数据。因此我们得到“枚举更新”或“参数非空”类型等异常。

我已经使用了ReadWriteLock,但是在ReaderWriterLock.AcquireWriterLock()上找不到运气。

我不明白我在哪里做错了。

如果有人有任何想法。请帮助我如何为数据表和数据视图的场景实现ReaderWriterLock。

谢谢!

1 个答案:

答案 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();
    }
}

关键点:

  1. 喜欢作家而不是读者
  2. 先到先得
  3. 旋转锁定使用非常适用于SHORT锁定持续时间
相关问题