У меня есть цикл 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
}
Должен быть некоторый API, параметр Property внутри библиотеки TPL, который мог бы справиться с этим сценарием. Есть ли?