2 つの異なるスレッドに入力するBindingListがあります... BindingList.Add()メソッド ThreadSafe を使用していますか?
3 に答える
いいえ、Collection<T>.Add
スレッドセーフではありません。
多くの場合、MSDN では、個々のメソッドではなく、クラスの記事でスレッド セーフについて説明しています。コレクションのためのイエ
コレクションが変更されない限り、コレクションは複数のリーダーを同時にサポートできます。それでも、コレクションの列挙は本質的にスレッドセーフな手順ではありません。列挙中のスレッド セーフを保証するために、列挙全体でコレクションをロックできます。読み取りと書き込みのために複数のスレッドがコレクションにアクセスできるようにするには、独自の同期を実装する必要があります。
インターフェイスはスレッド セーフ要件を定義していないため、インターフェイスのメソッドがスレッド セーフかどうかは判断できないことに注意してください。メソッド シグネチャのみを指定します。スレッドの安全性に関する特定の保証があるかどうか、個々の実装を確認する必要があります。
いいえ、BindingList.Add
メソッドはスレッドセーフではありません。
クラスのドキュメントでは、スレッド セーフの下に次の標準フレーズがあります。
「この型の public static (Visual Basic では共有) メンバーはスレッド セーフです。インスタンス メンバーは、スレッド セーフであるとは限りません。」
つまり、このクラスにはスレッド セーフに関する考慮事項がないということです。
インスタンスへのすべてのアクセスを同期する必要がありBindingList
ます。lock
キーワードでそれを使用できます:
lock(_sync) {
myBindingList.Add(something);
}
変数_sync
が参照するオブジェクトはロックの識別子として使用されるため、そのリストにアクセスするすべてのコードは、ロックに対して同じ参照を使用する必要があります。通常、オブジェクト インスタンスが使用されます。
private object _sync = new Object();
System.Collections.Concurrent 名前空間は、複数のスレッドがコレクションに同時にアクセスしているときに、System.Collections および System.Collections.Generic 名前空間の対応する型の代わりに使用する必要があるスレッド セーフなコレクション クラスをいくつか提供します。
http://msdn.microsoft.com/en-us/library/system.collections.concurrent.aspx