Проблема с зависанием при использовании Parallel.ForEach

Я использую Parallel.ForEach в качестве образца:

ParallelOptions parallelOpt = new ParallelOptions();
parallelOpt.MaxDegreeOfParallelism = 2;
Parallel.ForEach(list, parallelOpt, info =>
    {
        int threadID = Thread.CurrentThread.ManagedThreadId;
        //use tmp var to avoid conflic with original var when using thread
        ML_Scheduler tmp = new ML_Scheduler();
        tmp = ObjectCopier.Clone<ML_Scheduler>(info);
        Stopwatch sw1 = Stopwatch.StartNew();
        logger.Info("\r\n\r\n");
        logger.Info(string.Format("[{0}]****** Begin to schedule work with ThreadID {0} for ScheduleID {1}.", threadID, tmp.SchedulerID));
        WorkWithEachSchedule(threadID, tmp, tmp.SchedulerID, dtNow, tmp.StartTime, false);
        TimeSpan time1 = TimeSpan.FromSeconds(sw1.ElapsedMilliseconds / 1000.0);
        logger.Info(string.Format("[{0}]****** Finish to work with ThreadID {0} (during time : {1}).", threadID, time1.ToString(@"hh\:mm\:ss\:fff")));
    }
);

В функции WorkWithEachSchedule я просто делаю:

  1. Создайте таблицу данных с примерно 10000 записей для тестирования.

  2. Экспорт данных в Excel 2007

  3. Сохранить в локальную папку.

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

Но через несколько минут программа зависнет (как на примере изображения) введите здесь описание изображения

Не работает ни ЦП, ни Память, программа больше ничего не работает.

И я также не могу отладить по точке останова.

Обновление:

В своем коде я использую функцию ExporttoExcel по следующей ссылке: http://mikesknowledgebase.azurewebsites.net/pages/CSharp/ExportToExcel.htm

И когда я удаляю эту функцию, программа может работать правильно.

Я не знаю, почему эта функция вызывает проблему.

Любой совет. Спасибо.


person Lang thang    schedule 03.11.2015    source источник
comment
как экспортировать в excel?   -  person Backs    schedule 03.11.2015
comment
Что происходит с 1 MaxDOP?   -  person spender    schedule 03.11.2015
comment
Вы всегда можете приостановить программу, а затем пройтись по потокам/задачам и на каждом проверить свой стек. Очень вероятно, что вы можете найти таким образом какой-то общий метод, который используется одновременно, но не был спроектирован как одновременно безопасный, или вы можете найти причину взаимоблокировки. Для получения дополнительной помощи вам нужно будет предоставить код, который скрыт от нас. Готовить из воды можно, но ингредиенты тоже нужны :).   -  person ipavlu    schedule 03.11.2015
comment
Обычно вы не можете отлаживать вещи, выходящие за рамки кода вашего проекта, то есть сторонние библиотеки, код, связанный с системными вызовами и т. д. Также создание 10 тыс. записей, скажем так, это может быть медленным в Excel, но это все о недостающей информации. Работает нормально только последовательно?   -  person ipavlu    schedule 03.11.2015
comment
@spender, с 1 MaxDOP работает правильно. Обработка по одному расписанию.   -  person Lang thang    schedule 03.11.2015
comment
@Backs, я использовал функцию по следующей ссылке mikesknowledgebase.azurewebsites.net/pages/CSharp/   -  person Lang thang    schedule 03.11.2015
comment
@ipavlu, да, работает нормально только при последовательном запуске (с 1 MaxDOP)   -  person Lang thang    schedule 03.11.2015
comment
Если вы не можете выполнить отладку с помощью точки останова, попробуйте комментировать коды внутри foreach построчно, пока не узнаете, какая строка вызывает проблему. В некоторых случаях вам может понадобиться использовать блокировку.   -  person M.kazem Akhgary    schedule 03.11.2015
comment
У меня была такая же проблема с OpenXML, проверьте здесь stackoverflow.com /вопросы/21482820/   -  person Backs    schedule 03.11.2015
comment
@Backs В общем, большинство библиотек, которые можно получить, не являются потокобезопасными, если это явно не указано и даже если указано, иногда зависает :). Стыдно, многоядерные процессоры существуют уже более десяти лет, но поддержки в продуктах с открытым исходным кодом и даже в коммерческих продуктах не хватает... Ради интереса я заметил, что некоторые разработчики не считают навыки и знания эффективной параллельной разработки кода чем-то что следует отметить как важное, полезное, способное поощрить :).   -  person ipavlu    schedule 03.11.2015


Ответы (1)


Обратите внимание, что автор библиотеки, которую вы используете, отметил это:

Также возникает проблема при записи большого количества строк (более 30 000) в файл Excel. Библиотеки OpenXML просто зависают, когда слишком много данных для записи. Я еще не реализовал решение этой проблемы.

Автор отметил, что он решил проблему, но зависание может означать, что проблема все еще существует, или, возможно, она не предназначена для одновременного использования...

person ipavlu    schedule 03.11.2015