2012-01-06 10 views
0

私のコード(C#)にはキューやリストを変更する場所がいくつかあります。キューまたはリストを変更するスレッドが1つしかないことをいつでも確認したい。どのようにC#の一貫性を維持するには?おかげ一度に1つのスレッドだけがコレクションタイプのインスタンスにアクセスできるようにする方法

編集 キューまたはリストにアクセスしたり、修正しながら、サンプルコードCOMException on Main Thread of WPF application

答えて

2

がミューテックスを持ちご覧ください。

2

lockステートメントを使用してください。

lock(myObject) { 

    //Code 

    } 
2

System.Collections.Concurrent名前空間の別の場所枠組みの中で利用可能ないくつかのスレッドセーフな種類があります。これらを使用するのが最も簡単な方法です。

lockステートメントを使用して、独自の明示的なロックを実行することもできます。例えば。

public class Foo 
{ 
    private readonly List<int> list = new List<int>(); 
    private readonly object locker = new object(); 

    public void SomeCommand(Bar bar) 
    { 
     lock (this.locker) 
     { 
      // do something here? 
      this.list.Add(..); 
      // do something here? 
     } 
    } 

    public Baz SomeQuery() 
    { 
     lock (this.locker) 
     { 
      // do something here? 
      this.list.Select(...); 
      // do something here? 
     } 
    } 

    public void SomethingElseEntirely() 
    { 
     lock (this.locker) 
     { 
      // do something here 
     }    
    } 
} 

最高のオプションは、ケースによって異なります。例えば。 (コードサンプルに示されているように)コレクション操作以外の操作も同期したいのですが、読み込みより多くの読み込みや読み込みより多くの書き込みでパフォーマンスを調整したいですか(組み込み型のいくつかは既に)

ReaderWriterLockSlimなどの明示的なスレッド同期タイプをテストして、書き込みよりも多くの読み込みに最適化し、シナリオに最適なものを確認することもできます。

+0

私は、コレクション操作に同期させたいと思っています。コレクションがアクセスされている複数のコードセクションを実行したい場合は、いつでも1つのセクションしか実行されません。 – toosensitive

+0

ロックを使用しましたが、うまく機能していないようです – toosensitive

+0

ロックは広告されたとおりに働くあなたはどんな問題を経験していますか? –

1

ConcurrentQueueなどの組み込みのスレッドセーフなコレクションを使用することをお勧めします。

関連する問題