2009-08-14 8 views
1

私は汎用のスレッドセーフなコレクションを持っていますが、Arraylistは静的な同期メソッドでスレッドセーフに簡単に使用できることがわかりましたが、このArrayListは汎用性がないため、それらをキャストする。これを行う簡単な方法はありますか?他のリストタイプも可能です。スレッドセーフなジェネリックarraylist?

+0

はい、おそらく他のソリューションでもArrayListをラップできますか? :) –

答えて

3

少し知識は危険なことです;-)はい、あなたはメタナイトの提案を使用してSyncRootを使用することができますが、あなたは注意する必要がある - それは万能薬ではありません。マイクロソフトのBCLチームブログのthis postを参照して、SyncRootという単純な理由がわからない理由を確認してください。その記事からの引用:

私たちの一般的な コレクションのいくつかの抜け目のないユーザーは、我々はもはや が ICollection<T>

にパブリックSyncRootプロパティを提供することを認められていない私たちだと思います 人々がより多くのことをもっと重く考えるように強制する方が良い 同期、そして率直にa SyncRoot一般的な コレクションのプロパティは値を提供しません。

もちろん、それはどのような状況でも使用できないというわけではありません。ユースケースを慎重に考え、自動操縦しないでください。

3

あなたは同期メソッドは、まだこれは言っているに関するMSDNで読む場合:。

「コレクションの列挙本質的にはスレッドセーフな処理ではないコレクションが同期されている場合でも、他のスレッドがまだコレクションを変更することができます列挙中にスレッドの安全性を保証するために、列挙全体でコレクションをロックするか、他のスレッドによって加えられた変更に起因する例外をキャッチすることができます。

3

List(T)ラッパーを作成し、SyncRootプロパティとのアクセスを同期させることができます。

MSDNの例:

ICollection ic = ...; 
lock (ic.SyncRoot) 
{ 
    // Access the collection. 
} 
関連する問題