我已经阅读了 MSDN 文档和这个博客,我需要以下逻辑:
为一个ConcurrentDictionary<string,bool>
- 如果字符串不存在,添加它,并确保我
True
在添加时将bool 设置为 - 如果字符串确实存在,则仅将 bool 更改为
True
false 。否则取消更新
我的用例
我有几个 DNS 域来扫描恶意软件。我实时检索的列表中很可能会有重复项。我以 100 个或更少的批次收到 DNS 域列表,并且将有超过 10,000 个域进行扫描。
我只想在每次迭代 10,000 个域时扫描一次 DNS 主机。Abool == true
表示它当前正在被扫描,我应该在继续之前取消该任务。有bool == false
或没有条目意味着我应该立即将条目更新为bool==true
或尽快创建一个新条目。
记住...
AddOrUpdate 将独立于 .NET4 的 TPL 中的许多独立线程调用。每个线程都需要决定它是否需要处理 Dictionary's key
... 中提到的值或继续下一个。只有一个“钥匙”应该对其进行处理。
我需要向调用线程发出更新成功或失败的信号。另外根据这个答案,AddOrUpdate 的函数似乎会被调用很多次。我认为这可能意味着我的调用线程会因为取消工作key
或继续工作而感到困惑。(记住只有一个线程可以积极工作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?