我在.NET 4中继承了Winforms应用程序(我不能改变它)。应用程序使用TPL并行运行多个任务。首先,创建一个任务,并从该任务生成更多的任务,这些任务执行复杂的计算。主要任务正在等待WaitAll(tasks)
。
问题是这些小计算任务向主表单报告进度,在每个进度报告中,应用程序调用{{1}}来更新进度条,但只有在完成所有任务后才会更新。我认为问题在于主要任务在UI线程上运行,并且通过调用BeginInvoke()
它会阻塞该线程,因此WaitAll()
调用堆积在事件循环上。
在这种情况下,正确的方法是什么?
阅读其他SO答案似乎我不能强制在ThreadPool线程上运行任务,所以我倾向于用BackgroundWorker替换主任务。
答案 0 :(得分:2)
在初始任务上设置选项TaskCreationOptions.LongRunning将使其在单独的线程(而不是线程池线程)上运行