等待一组任务的线程池线程最终能否为这些其他任务之一提供服务?



假设您创建了一组子任务,如下所示:

var childTasks = new List<Task<ResultType>>();
for (var i = 0; i < Count; i++)
{
var childTask = new Task<ResultType>(() => {  logic here  });
childTasks.Add(childTask);
childTask.Start();
}

如果某个逻辑操作"A"本身是作为任务启动的,并且正在我们命名为"A"的线程池线程中运行,并且它调用Task.WaitAll(childTasks.Select(x => (Task)x).ToArray()); //cast Task<T> to Task and make array as required by Task.WaitAll,那么在WaitAll操作期间,线程池线程"A"是否有可能返回到池中并用于为其中一个子任务提供服务? 换句话说,子任务是否有可能最终在调用任务使用的同一线程池线程上运行?

或者,WaitAll 是否会阻止当前线程并阻止其返回到池中?

A 将不会返回。您的代码仍在堆栈中。从根本上说,情况确实如此。

但可能会发生任务内联。每当您等待任务时,TPL 都可以直接在当前线程上执行该任务。这是一种效率优化。在我看来,这也是一个令人震惊的设计错误。这意味着等待任何任务实际上都可以在这一点上执行任意代码。这是非常不可预测的。

childTask.Start()不会这样做,因为它不会等待,但所有等待函数都可以这样做。太可怕了。请参阅 https://github.com/dotnet/corefx/issues/2454

最新更新