2010-05-04 6 views
1

У меня есть приложение в .net 2.0, в котором у меня есть объект DataTable глобально в моем приложении и есть разные типы данных в целом приложении.Синхронизировать datatable/dataview для чтения написать

Когда выполнено действие, я создал много потоков, которые говорят, что 5, в которых данные считываются из разных источников данных, между тем, в то время как 2/3 потоки считывают данные (не все еще два для чтения данных) данные записи потока в datatable , Таким образом, мы получаем исключения, такие как «Enumeration update» или «parameter not null».

Для этого я использую ReadWriteLock, но не вижу удачи, что он останавливается на ReaderWriterLock.AcquireWriterLock().

Я не понимаю, где я делаю неправильно.

Если у кого-либо есть идеи. Пожалуйста, помогите мне, как реализовать ReaderWriterLock для этого сценария для datatable и dataview.

Спасибо!

ответ

0

Для начала, this MSDN article может быть полезен. Библиотека, о которой говорит Джеффри Рихтер, доступна 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. Спина используется так идеально для коротких замков-длительностей только