2010-05-04 40 views
1

我有.net 2.0中的应用程序,其中我的应用程序中有一个全局的DataTable对象,并且在整个应用程序中有不同的数据视图。为读写同步datatable/dataview

当一个动作执行时,我创建了许多线程让我们说5从哪个数据读取不同的数据视图,与此同时,2/3线程正在读取数据(并不是所有2个左边都读取数据)线程在数据表中写入数据。所以我们得到像“Enumeration update”或“parameter not null”类型的异常。

我已经使用ReadWriteLock这个,但没有找到任何运气它停止在ReaderWriterLock.AcquireWriterLock()。

我不明白我在做错的地方。

如果有人有任何想法。请帮助我如何为这种情况下的数据表和数据视图实现ReaderWriterLock。

谢谢!

回答

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. 自旋锁使用,因此非常适合短锁定持续时间仅