Может ли поток пула потоков, ожидающий множество задач, в конечном итоге обслуживать одну из этих других задач? - PullRequest
0 голосов
/ 22 мая 2018

Предположим, у вас есть набор подзадач, созданный следующим образом:

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" сама была запущена как Задача и выполняется в потоке ThreadPool, который мы назвали«A», и он вызывает Task.WaitAll(childTasks.Select(x => (Task)x).ToArray()); //cast Task<T> to Task and make array as required by Task.WaitAll, есть ли ЛЮБОЙ шанс, что поток ThreadPool «A» будет возвращен в пул во время операции WaitAll и использован для обслуживания одной из дочерних задач?Другими словами, есть ли вероятность того, что childTask в конечном итоге будет работать в том же потоке пула потоков, который использовала вызывающая задача?

Или WaitAll блокирует текущий поток и не позволяет ему вернуться в пул

1 Ответ

0 голосов
/ 22 мая 2018

A не возвращается.Ваш код все еще в стеке.Это в корне так.

Но может произойти встраивание задач.Каждый раз, когда вы ожидаете Задачу, TPL может напрямую выполнить эту задачу в текущем потоке.Это оптимизация эффективности.Это также, по моему не столь скромному мнению, вопиющая ошибка дизайна.Это означает, что ожидание любой задачи может на практике выполнить произвольный код в этой точке.Это очень непредсказуемо.

childTask.Start() не сделает этого, так как не ждет, но все функции ожидания могут это сделать.Это ужасно.Смотри https://github.com/dotnet/corefx/issues/2454

...