2013-11-15 3 views
1

Я унаследовал приложение Winforms в .NET 4 (я не могу это изменить). Приложение выполняет несколько задач параллельно с использованием TPL. Во-первых, создается задача и из этой задачи генерируется еще много задач, которые выполняют сложные вычисления. Основная задача ждет WaitAll(tasks).Выполнение нескольких задач с сообщением о ходе работы

Проблема заключается в том, что эти небольшие задачи вычисления сообщают о прогрессе в основной форме, в каждом отчете о ходе выполнения приложение вызывает BeginInvoke(), чтобы обновить индикатор выполнения, но он обновляется только после завершения всех задач. Я считаю, что проблема заключается в том, что основная задача выполняется в потоке пользовательского интерфейса, и, вызывая WaitAll(), она блокирует этот поток, так что вызовы BeginInvoke() накапливаются в цикле событий.

Каков правильный подход в этом случае?

Чтение других ответов SO Кажется, что я не могу заставить задачу запускать поток ThreadPool, поэтому я склонен заменить основную задачу BackgroundWorker.

+0

Правильный подход зависит от причины, почему вы должны сделать WaitAll(). Однако я думаю, что в большинстве случаев использование фонового потока для ожидания завершения всех задач должно работать. – elgonzo

+0

Мне нужно WaitAll, потому что мне нужно делать больше вещей, когда основная задача завершена (она имеет вызов ContinueWith()). – Buzzy

+0

Затем используйте рабочий рабочий поток. Один из способов сделать это, как это было предложено ответом Кева, например. (Хотя это поведение TaskCreationOptions.LongRunning подтверждено Microsoft for .NET 4.x, это не гарантируется поведение для будущей версии .NET. Но опять-таки несколько маловероятно, что это будет изменено, поскольку это «подтвержденная деталь реализации» ';-)) – elgonzo

ответ

2

установка опции TaskCreationOptions.LongRunning на вашей первоначальной задачей будет заставить его работать в отдельном потоке (не поток пула потоков)

+0

На самом деле я пробовал это, и он не работал. Задача по-прежнему выполняется в основном потоке. – Buzzy

+0

столько, сколько я пытался, я не мог получить задачу для запуска в том же потоке, что и поток ui в образце приложения, которое я создал на моей машине. У Rich Newman есть образец на его сайте, который может быть тем, что вы ищете. http://richnewman.wordpress.com/2012/11/21/why-starting-a-new-task-in-the-task-parallel-library-tpl-doesnt-always-start-a-new-thread/ – Kev

+0

В моем случае он всегда работает в потоке пользовательского интерфейса. Я устал изменять параметры и планировщик, но он подошел к потоку пользовательского интерфейса. – Buzzy

Смежные вопросы