我有一个Backgroundworker,其目的是在后台按顺序运行作业。现在,一项工作是以多线程方式实现的。这意味着Backgroundworker将创建多个线程。我使用任务并行库,所以我使用Task.Factory.StartNew创建多个任务。
运行任务后,Backgroundworker等待所有任务完成。
现在,我打印Backgroundworker的ManagedThreadID和所有任务的ManagedThreadID。我发现BackgroundWorker的ManagedThreadID始终与第一个任务的ManagedThreadID相同。我认为这不应该发生,所以我无法解释。我认为Backgroundworker的线程必须与其创建的所有任务都不同,因此ManagedThreadID必须彼此不同。
谁能解释为什么会发生这种情况?非常感谢你。
编辑:
代码类似于以下内容:
Backgroundworker.Run(){
// Print Thread.CurrentThread.ManagedThreadID.
var task = Task.Factory.StartNew(action1); // action1, action2 also print ManagedThredID.
taskList.Add(task);
task = Task.Factory.StartNew(action2);
taskList.Add(task);
... // Several other tasks.
foreach(var task in taskList) task.Wait();
}
您会发现一个任务与Backgroundworker具有相同的ManagedThreadID。
最佳答案
我会在这里徘徊,猜测TPL足够聪明,可以重用BackgroundWorker
线程。由于 worker 等待所有任务完成以在同一线程中运行一个任务,因此这可能是一种优化。
通过进一步的调查,您看到的是Task.Wait
方法的预期行为的结果。您可以在Parallel Programming Team博客上的Task.Wait and "Inlining"上阅读更多内容。