Я унаследовал приложение Winforms в .NET 4 (я не могу это изменить). Приложение выполняет несколько задач параллельно с использованием TPL. Во-первых, создается задача и из этой задачи генерируется еще много задач, которые выполняют сложные вычисления. Основная задача ждет WaitAll(tasks)
.Выполнение нескольких задач с сообщением о ходе работы
Проблема заключается в том, что эти небольшие задачи вычисления сообщают о прогрессе в основной форме, в каждом отчете о ходе выполнения приложение вызывает BeginInvoke()
, чтобы обновить индикатор выполнения, но он обновляется только после завершения всех задач. Я считаю, что проблема заключается в том, что основная задача выполняется в потоке пользовательского интерфейса, и, вызывая WaitAll()
, она блокирует этот поток, так что вызовы BeginInvoke()
накапливаются в цикле событий.
Каков правильный подход в этом случае?
Чтение других ответов SO Кажется, что я не могу заставить задачу запускать поток ThreadPool, поэтому я склонен заменить основную задачу BackgroundWorker.
Правильный подход зависит от причины, почему вы должны сделать WaitAll(). Однако я думаю, что в большинстве случаев использование фонового потока для ожидания завершения всех задач должно работать. – elgonzo
Мне нужно WaitAll, потому что мне нужно делать больше вещей, когда основная задача завершена (она имеет вызов ContinueWith()). – Buzzy
Затем используйте рабочий рабочий поток. Один из способов сделать это, как это было предложено ответом Кева, например. (Хотя это поведение TaskCreationOptions.LongRunning подтверждено Microsoft for .NET 4.x, это не гарантируется поведение для будущей версии .NET. Но опять-таки несколько маловероятно, что это будет изменено, поскольку это «подтвержденная деталь реализации» ';-)) – elgonzo