2010-05-04 10 views
1

.net 2.0에서 응용 프로그램에 DataTable 객체가 전역으로 있고 전체 응용 프로그램에서 다른 dataviews를 가진 응용 프로그램이 있습니다.읽기/쓰기를 위해 datatable/dataview를 동기화하십시오.

작업을 수행 할 때 많은 스레드를 만들면 다른 데이터 뷰에서 데이터를 읽는 동안 5 분의 2 스레드가 데이터를 읽는 동안 (데이터를 읽는 데 모두 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. 회전 잠금을 제공 와서 독자를 통해 작가를 선호 만
관련 문제