スレッド セーフ コレクションが必要ですが、ConcurrentDictionary を .NET 4.0 として使用できず、.NET 3.5 を使用する必要があります。そこにはどのような代替案がありますか?
質問する
5761 次
5 に答える
6
最後に、私は自分が求めていたものを見つけました。3.5 にバックポートされた TPL の nuget パッケージ。ここで見つけることができます http://nuget.org/packages/TaskParallelLibrary
于 2012-09-04T22:42:39.027 に答える
4
この記事を見てください
于 2012-08-30T04:51:44.457 に答える
3
Framework 3.5 の場合、次のオプションが表示されます。
- ディクショナリ+モニター。ロックするためのシンプルなラップ
- Dictionary + ReaderWriterLock . 読み取りおよび書き込みロックを取得しているため、前のものよりも優れています。したがって、複数のスレッドが読み取り可能で、1 つのスレッドのみが書き込み可能です。
- 辞書+ ReaderWriterLockSlim。それは前のものの最適化です。
- ハッシュテーブル。私の経験から、それは最も遅い方法です。Hashtable.Synchronized()メソッドを確認してください。これは、Microsoft のすぐに使用できるソリューションです。
Dictionary + ReaderWriterLockまたはReaderWriterLockSlimを使用します。
于 2012-10-28T22:21:50.453 に答える
2
シンプルなラッパーを作成し、必要なものだけを実装できます。前の呼び出しの結果に依存する Dictionary で操作を実行することは、スレッドセーフではないことに注意してください。TryAdd
これは、メソッドで例示されています。
class ConcurrentMap<K, V>
{
readonly Dictionary<K, V> _map = new Dictionary<K, V>();
public bool TryGetValue(K key, out V value)
{
lock (_map)
{
return _map.TryGetValue(key, out value);
}
}
public bool TryAdd(K key, V value)
{
lock (_map)
{
if (!_map.ContainsKey(key))
{
_map.Add(key, value);
return true;
}
return false;
}
}
public bool TryRemove(K key)
{
lock (_map)
{
return _map.Remove(key);
}
}
}
于 2012-08-30T05:28:42.583 に答える