Parallel.ForEach Отладка или шаг - программирование
Подтвердить что ты не робот

Parallel.ForEach Отладка или шаг

Есть ли простой способ пройти через параллель. Каков наилучший способ отладить это с точкой останова?

4b9b3361

Ответ 1

Фактически вы можете получить аналогичные результаты с помощью Visual Studio, просто заморозив все потоки, кроме одного, выберите все потоки, кроме одного, в окне "Темы" и щелкните правой кнопкой мыши → "Замерзать" следующим образом:

введите описание изображения здесь

Кроме того, если вы хотите воспроизвести состояние гонки и остановить ее на контрольных точках, вы всегда можете добавить точки трассировки - либо с визуальной студией, либо с помощью плагинов, которые помогают с ней, например, код Oz

введите описание изображения здесь

Ответ 2

Во время отладки я часто настраиваю мой Parallel.ForEach для запуска с MaxDegreeOfParallelism, установленным в 1. Это значительно упрощает отладку.

const bool forceNonParallel = true;
var options = new ParallelOptions { MaxDegreeOfParallelism = forceNonParallel ? 1 : -1 };
Parallel.ForEach(collection, options, item => 
{ //...

Однако это не поможет в вопросах отладки, связанных с условиями гонки или синхронизации данных, и на самом деле часто скрывает или устраняет реальные проблемы в вашем коде.

Эти проблемы часто можно отлаживать гораздо проще с помощью новых инструментов в VS 2010, таких как Parallel Tasks window или используя различные методы, перечисленные в Отладка многопоточных приложений, например переключения потоков, блокировка потоков при шаге и т.д.

Ответ 3

Как и в других ответах, мы устанавливаем степень parallelism в 1 при отладке, но мы делаем это с помощью метода расширения, например:

public static ParallelQuery<TSource> AsDebugFriendlyParallel<TSource>(this IEnumerable<TSource> source)
{
    var pQuery = source.AsParallel();
    #if DEBUG
    pQuery = pQuery.WithDegreeOfParallelism(1);
    #endif

    return pQuery;
}

Затем вместо использования .AsParallel() мы используем .AsDebugFriendlyParallel()

Ответ 4

Временно переписать его как непараллельный foreach или использовать директивы препроцессора для выполнения непараллельного кода при работе в режиме отладки.

Ответ 5

Мне нравится использовать опцию "When Hit" в точке останова (щелкните правой кнопкой мыши точку останова, выберите "When Hit...". Вы можете распечатать сообщение на консоли, которое содержит значения переменных, поток, который вы используете и т.д.

Ответ 6

OzCode поможет вам много, у него есть функция, такая как точки трассировки на стероидах, что очень полезно при отладке параллельного\параллельного кода https://www.youtube.com/watch?v=_vuMi-3jGwY