Ste*_*eve 3 .net c# multithreading task-parallel-library
我有一个Backgroundworker,其目的是在后台顺序运行作业.现在,一项工作以多线程方式实现.这意味着,Backgroundworker将创建多个线程.我使用任务并行库,所以我使用Task.Factory.StartNew创建多个任务.
任务运行后,Backgroundworker等待所有任务完成.
现在我打印Backgroundworker的ManagedThreadID和所有任务'ManagedThreadIDs.我发现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();
}
Run Code Online (Sandbox Code Playgroud)
您会发现一个任务与Backgroundworker具有相同的ManagedThreadID.
我会在这里继续思考并猜测TPL足够聪明以重用该BackgroundWorker线程.由于worker等待所有任务完成,因此在同一个线程中运行一个任务可能是一个优化.
通过进一步调查,您所看到的是该Task.Wait方法的预期行为的结果.您可以在Parallel.Wait和 Parallel Programming Team博客上的"Inlining"中阅读更多内容.
如果正在等待的任务已经开始执行,则Wait必须阻止.但是,如果它尚未开始执行,则Wait可能能够将目标任务从其排队的调度程序中拉出并在当前线程上内联执行.