gpt4 book ai didi

c# - Backgroundworker 和 TPL 的 Task 有相同的 ManagedThreadID?

转载 作者:行者123 更新时间:2023-11-30 13:42:09 25 4
gpt4 key购买 nike

我有一个 Backgroundworker,其目的是在后台按顺序运行作业。现在一项工作以多线程方式实现。这意味着,Backgroundworker 将创建多个线程。我使用任务并行库,所以我使用 Task.Factory.StartNew 来创建多个任务。

任务运行后,Backgroundworker 等待所有任务完成。

现在我打印 Backgroundworker 的 ManagedThreadID 和所有任务的 ManagedThreadID。我发现 BackgroundWorker 的 ManagedThreadID 始终与第一个任务的 ManagedThreadID 相同。我认为这不应该发生,所以我无法解释。我认为 Backgroundworker 的线程必须不同于它创建的所有任务,因此 ManagedThreadIDs 必须彼此不同。

谁能解释为什么会出现这种情况?非常感谢。

编辑:

代码类似这样:

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 线程。由于工作人员等待所有任务完成,因此在同一线程中运行一个任务可能是一种优化。

通过进一步调查,您所看到的是 Task.Wait 方法预期行为的结果。您可以在 Task.Wait and "Inlining" 阅读更多内容在并行编程团队博客上。

If the Task being Wait’d on has already started execution, Wait has to block. However, if it hasn’t started executing, Wait may be able to pull the target task out of the scheduler to which it was queued and execute it inline on the current thread.

关于c# - Backgroundworker 和 TPL 的 Task 有相同的 ManagedThreadID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3735122/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com