2010-05-04 65 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. 自旋鎖使用,因此非常適合短鎖定持續時間僅