我有一个 Parallel.ForEach 循环在体内运行密集操作。
该操作可以使用 Hashtable 来存储值,并且可以重复用于其他连续的循环项。我在密集操作完成后添加到Hashtable中,下一个循环项可以在Hashtable中查找并重用对象,而不是再次运行密集操作。
但是,因为我使用的是 Parallel.ForEach,所以存在一个不安全的问题,导致 Hashtable.Add 和 ContainsKey(key) 调用不同步,因为它们可能并行运行。引入锁可能会导致性能问题。
这是示例代码:
Hashtable myTable = new Hashtable;
Parallel.ForEach(items, (item, loopState) =>
{
// If exists in myTable use it, else add to hashtable
if(myTable.ContainsKey(item.Key))
{
myObj = myTable[item.Key];
}
else
{
myObj = SomeIntensiveOperation();
myTable.Add(item.Key, myObj); // Issue is here : breaks with exc during runtime
}
// Do something with myObj
// some code here
}
TPL 库中必须有一些 API,属性设置,可以处理这种情况。有没有?