【发布时间】:2012-11-18 23:00:59
【问题描述】:
我已经阅读了 MSDN 文档和this blog,我需要以下逻辑:
对于ConcurrentDictionary<string,bool>
- 如果字符串不存在,添加它,并确保我在添加时将布尔值设置为
True - 如果字符串确实存在,则仅将布尔值更改为
True,如果它是假的。否则取消更新
我的用例
我有几个 DNS 域要扫描恶意软件。我实时检索的列表中很可能会有重复项。我以 100 个或更少的批次收到 DNS 域列表,将有超过 10,000 个域进行扫描。
我只想在每次迭代 10,000 个域时扫描一次 DNS 主机。 bool == true 表示它当前正在被扫描,我应该在继续之前取消任务。 bool == false 或没有条目意味着我应该立即将条目更新为 bool==true 或尽快创建一个新条目。
记住...
AddOrUpdate 将被独立于 .NET4 的 TPL 中的许多独立线程调用。每个线程都需要决定它是否需要处理 Dictionary 的 key... 中提到的值,还是继续下一个。应该只对一个“键”进行处理。
我需要通知调用线程更新成功或失败。另外according to this answer好像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 中?
【问题讨论】:
-
不会将已经是
True的值设置为True是空操作吗?为什么要取消? -
@Blorgbeard,如果您指的是#1,我的意思是,但我不够明确。我更新了项目符号并添加了一个用例进行说明。
标签: c# .net multithreading concurrency concurrentdictionary