2

スレッド セーフ コレクションが必要ですが、ConcurrentDictionary を .NET 4.0 として使用できず、.NET 3.5 を使用する必要があります。そこにはどのような代替案がありますか?

4

5 に答える 5

6

最後に、私は自分が求めていたものを見つけました。3.5 にバックポートされた TPL の nuget パッケージ。ここで見つけることができます http://nuget.org/packages/TaskParallelLibrary

于 2012-09-04T22:42:39.027 に答える
4

この記事を見てください

「スレッドセーフ」辞書(TKey,TValue)

于 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 に答える