MSDN ドキュメントとこのブログを読みましたが、次のロジックが必要です。
のためにConcurrentDictionary<string,bool>
- 文字列が存在しない場合は追加し、追加
True
中にブール値を設定していることを確認してください - 文字列が存在する場合は、
True
それが false の場合にのみ bool を変更します。それ以外の場合は、更新をキャンセルします
私のユースケース
マルウェアをスキャンする DNS ドメインがいくつかあります。私がリアルタイムで取得するリストには重複がある可能性が高いです。DNS ドメインのリストを 100 以下のバッチで受け取ります。スキャンするドメインは 10,000 を超えます。
10,000 ドメインの反復ごとに 1 回だけ DNS ホストをスキャンしたいと考えています。Abool == true
は、現在スキャン中であり、先に進む前にタスクをキャンセルする必要があることを意味します。bool == false
エントリがない場合は、すぐにエントリを更新するか、できるだけ早く新しいエントリを作成する必要があることを意味しますbool==true
。
覚えておいてください...
AddOrUpdate は、.NET4 の TPL の多くの独立したスレッドから独立して呼び出されます。key
各スレッドは、ディクショナリの...に記載されている値で作業する必要があるか、次の値に進む必要があるかを決定する必要があります。1 つの「キー」だけが作業を行う必要があります。
更新が成功したか失敗したかを呼び出し元のスレッドに通知する必要があります。さらに、この回答によると、AddOrUpdate の関数が何度も呼び出されるようです。key
これは、呼び出しスレッドが作業をキャンセルするか続行するかについて混乱することを意味する可能性があると思います。(アクティブに作業できるスレッドは 1 つだけであることを覚えておいてくださいkey
呼び出しスレッドを混乱させる可能性のある同時更新の例
ConcurrentDictionary<int, string> numbers = new ConcurrentDictionary<int, string>();
Parallel.For(0, 10, x =>
{
numbers.AddOrUpdate(1,
i =>
{
Console.WriteLine("addValueFactory has been called");
return i.ToString();
},
(i, s) =>
{
Console.WriteLine("updateValueFactory has been called");
return i.ToString();
});
});
出力
addValueFactory has been called
addValueFactory has been called
addValueFactory has been called
addValueFactory has been called
updateValueFactory has been called
updateValueFactory has been called
updateValueFactory has been called
updateValueFactory has been called
updateValueFactory has been called
updateValueFactory has been called
updateValueFactory has been called
updateValueFactory has been called
updateValueFactory has been called
質問
この「更新のキャンセル」機能を AddOrUpdate に追加するにはどうすればよいですか?