これまで、私の基本クラスのほとんどは、マルチスレッドでのキャッシュ競合を処理するためにロックとハッシュテーブルの組み合わせを使用していましたが、これら 2 つの組み合わせを使用すると、コレクションが追加されたという例外が発生することがありました。コードを複数回処理しても問題は変わりませんでしたが、最終的に、.NET 4.0 以降に導入された ConcurrentDictionary マルチスレッド同期辞書コレクションが使用され、問題は正常に解決されました。
var result = BLLFactory<Customer>.Instance.FindFirst(); Console.WriteLine(result.ToJson());
HashTable は、キーと値のペアのコレクションを表します。 .NET Framework では、Hashtable は System.Collections 名前空間によって提供されるコンテナーであり、キーと値のペアを処理および表現するために使用されます。キーは値の大文字と小文字を区別します。キーに対応する値を格納するために使用されます。 Hashtable のキーと値のペアはすべてオブジェクト型であるため、Hashtable はあらゆる種類のキーと値のペアをサポートでき、null 以外の任意のオブジェクトをキーまたは値として使用できます。
この方法を使用しても、Web 側でマルチスレッド アクセスの競合が発生することがあります。このため、マルチスレッド テスト コードを使用してエラーをテストし、再現することもできます。トラッキングコードは以下の通りです。
したがって、上記のコードからわかるように、lock(syncRoot)を使用してもマルチスレッド競合の問題は発生しません。2. Hashtable の代わりに ConcurrentDictionary を使用する
ConcurrentDictionary は、.net4.0 によって起動されたスレッドセーフなコレクションの 1 つで、ConcurrentStack、ConcurrentQueue、およびそれらのシングルスレッド バージョンも同時にリリースされています。スレッドアンセーフ (キュー、スタック、ディクショナリ) についてはよく知っているでしょう。 ConcurrentDictionary<
TKey, は複数のスレッドから同時にアクセスでき、スレッドセーフです。ただし、いくつかのメソッドが追加されています。 ConcurrentDictionary は System.Collections.Concurrent 名前空間に属します。System.Collections.Concurrent 名前空間は、複数のスレッドセーフなコレクション クラスを提供します。複数のスレッドがコレクションに同時にアクセスする場合、System.Collections および System.Collections.Generic 名前空間
の対応する型の代わりに、これらのクラスを使用する必要があります。 ConcurrentDictionary このクラスは、コレクションを処理するための次のメソッドを提供します try{
List<Thread> list = new List<Thread>();for (int i = 0; i < 10; i++)
{
Thread thread = new Thread(() =>{var result = BLLFactory<Customer>.Instance.FindFirst();
Console.WriteLine(result.ToJson());
Console.WriteLine();
});
list.Add(thread);
}for (int i = 0; i < list.Count; i++)
{
list[i].Start();
}
}catch(Exception ex)
{
LogTextHelper.Error(ex);
}
public bool TryAdd(TKey key, TValue value)public bool TryUpdate(TKey key, TValue newValue, TValue comparisonValue)public TValue this[TKey key] { get; set; }public TValue AddOrUpdate(TKey key, FuncaddValueFactory, Func updateValueFactory) public TValue AddOrUpdate(TKey key, TValue addValue, Func updateValueFactory)public TValue GetOrAdd(TKey key, TValue value)public TValue GetOrAdd(TKey key, Func valueFactory) コードが大幅に簡略化されており、以前のマルチスレッド テスト コードを使用すると、例外なくスムーズにデータを取得できることがわかります。 実行中のコードはスムーズに実装でき、Hashtable を使用する前に発生していたマルチスレッド アクセス例外は発生しません。以上、マルチスレッドオブジェクトキャッシュ用の Hashtable に代わる ConcurrentDictionary の紹介でしたが、問題がスムーズに解決できれば、以前よりもアクセス効率も向上したことが分かり一石二鳥です。 。
以上がConcurrentDictionaryの使い方の詳細説明 マルチスレッド同期辞書収集例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。