увеличьте значение количества снаружи parallel.foreach объем

Как я могу увеличить целочисленное значение вне объема parallel.foreach цикла? То, каков самый легкий путь, должно синхронизировать доступ к объектам вне параллельных циклов?

var count = 0;
Parallel.ForEach(collection, item =>
{
  action(item);
  // increment count??
}
18
задан skaffman 6 March 2010 в 23:18
поделиться

2 ответа

Я люблю бить мертвых лошадей! :)

Самый "легкий" способ увеличить счетчик из нескольких потоков:

Interlocked.Increment(ref count);

Но, как отметили другие: если вы делаете это внутри Parallel.ForEach, то вы, вероятно, делаете что-то неправильно.

Я подозреваю, что по какой-то причине вы используете ForEach, но вам нужен индекс элемента, который вы обрабатываете (это никогда не будет работать с Parallel.ForEach). Я не ошибся? Зачем вам нужен счетчик? Что за магию VooDoo вы пытаетесь сделать?

UPDATE:

Похоже, вы в безопасности с ConcurrentDictionary, если ваш ключ - URI, а значение - TAnswer. Я не вижу проблемы до тех пор, пока вы не пытаетесь использовать счетчик для ссылок на элементы в вашей коллекции.

Наконец...

Если вам нужен счетчик, то используйте цикл Parallel.For... он безопасно увеличивает счетчик для вас.

34
ответ дан 30 November 2019 в 07:18
поделиться

Используйте Interlocked.Increment .

Я бы не стал увеличивать значения внутри параллельного foreach (если, конечно, вы не используете Interlocked.Increment или какой-либо другой механизм блокировки). Это не то, для чего это нужно. Параллельный foreach следует запускать только с действиями, которые не вызывают побочных эффектов в общем состоянии. Увеличение значения в параллельном foreach вызовет ту самую проблему, которую вы, скорее всего, пытаетесь избежать.

3
ответ дан 30 November 2019 в 07:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: