1

私は.net 2.0にアプリケーションを持っており、アプリケーションにグローバルにDataTableオブジェクトがあり、アプリケーション全体に異なるデータビューがあります。

アクションが実行されると、多くのスレッドが作成され、データが異なるデータビューから読み取られる 5 と言えます。一方、2/3 のスレッドがデータを読み取っている間 (データを読み取るために残り 2 つすべてではありません)、スレッドはデータテーブルにデータを書き込みます。そのため、「列挙型の更新」や「パラメーターが null ではない」タイプなどの例外が発生します。

これには ReadWriteLock を使用しましたが、ReaderWriterLock.AcquireWriterLock() で停止する運がありません。

どこが間違っているのかわかりません。

誰かが何か考えがあれば。データテーブルとデータビューのこのシナリオで ReaderWriterLock を実装する方法を教えてください。

ありがとう!!

4

1 に答える 1

0

まず、この MSDN の記事が役立つかもしれません。Jeffrey Richter が語っているライブラリは、こちらから入手できます。

アプリケーションは .Net 2.0 で開発されているため、リーダーよりもライターを優先するカスタム ReaderWriterLock を使用することをお勧めします。また、ソースコードを探しているなら、この人が助けになるかもしれません。カスタム ReaderWriterLock の 1 つで、彼は次のように書いています。

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. スピンロックが使用されているため、短いロック期間のみに最適です
于 2010-05-05T18:43:15.100 に答える