等待一组任务的线程池线程能否最终服务于其他任务之一?

时间:2018-05-22 17:06:01

标签: .net multithreading threadpool

假设您创建了一组子任务:

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();
}

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

或者,WaitAll是否阻止当前线程并阻止它返回池?

1 个答案:

答案 0 :(得分:1)

不会退回A.您的代码仍然在堆栈中。这基本上就是这样。

但是可以进行任务内联。无论何时等待任务,TPL都可以直接在当前线程上执行该任务。这是效率优化。在我不那么谦虚的意见中,它也是一个令人震惊的设计错误。这意味着等待任何任务在实践中可以在那时执行任意代码。这是非常不可预测的。

AttributeError: module 'cv2.cv2' has no attribute 'CV_LOAD_IMAGE_COLOR' 不会这样做,因为它不会等待,但所有等待函数都可以执行此操作。太可怕了。见https://github.com/dotnet/corefx/issues/2454