我有一个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"上阅读更多内容。

10-04 16:19
查看更多