Как я могу увеличить целочисленное значение вне объема parallel.foreach цикла? То, каков самый легкий путь, должно синхронизировать доступ к объектам вне параллельных циклов?
var count = 0;
Parallel.ForEach(collection, item =>
{
action(item);
// increment count??
}
Я люблю бить мертвых лошадей! :)
Самый "легкий" способ увеличить счетчик из нескольких потоков:
Interlocked.Increment(ref count);
Но, как отметили другие: если вы делаете это внутри Parallel.ForEach
, то вы, вероятно, делаете что-то неправильно.
Я подозреваю, что по какой-то причине вы используете ForEach
, но вам нужен индекс элемента, который вы обрабатываете (это никогда не будет работать с Parallel.ForEach
). Я не ошибся? Зачем вам нужен счетчик? Что за магию VooDoo вы пытаетесь сделать?
Похоже, вы в безопасности с ConcurrentDictionary
, если ваш ключ - URI
, а значение - TAnswer
. Я не вижу проблемы до тех пор, пока вы не пытаетесь использовать счетчик для ссылок на элементы в вашей коллекции.
Если вам нужен счетчик, то используйте цикл Parallel.For
... он безопасно увеличивает счетчик для вас.
Используйте Interlocked.Increment
.
Я бы не стал увеличивать значения внутри параллельного foreach (если, конечно, вы не используете Interlocked.Increment или какой-либо другой механизм блокировки). Это не то, для чего это нужно. Параллельный foreach следует запускать только с действиями, которые не вызывают побочных эффектов в общем состоянии. Увеличение значения в параллельном foreach вызовет ту самую проблему, которую вы, скорее всего, пытаетесь избежать.