Есть ли причина, по которой List <Task>не всегда работает параллельно? - PullRequest
2 голосов
/ 13 марта 2019

Когда мне нужна параллельная обработка, я обычно делаю это так:

static void Main(string[] args)
{
    var tasks = new List<Task>();
    var toProcess = new List<string>{"dog", "cat", "whale", "etc"};
    toProcess.ForEach(s => tasks.Add(CanRunAsync(s)));
    Task.WaitAll(tasks.ToArray());
}

private static async Task CanRunAsync(string item)
{
    // simulate some work
    await Task.Delay(10000);
}

У меня были случаи, когда при этом элементы не обрабатывались параллельно, и мне приходилось использовать Task.Run, чтобы заставить его работатьразные темы.

Что мне не хватает?

1 Ответ

12 голосов
/ 13 марта 2019

Task означает «то, что нужно сделать, которое, возможно, уже выполнено, может выполняться в параллельном потоке или может зависеть от внепроцессных данных (сокетов и т. Д.) Или может быть просто так... подключен к коммутатору где-то с надписью «сделано» - он имеет очень мало для работы с потоками, кроме: если вы планируете продолжение (он же await),затем каким-то образом , который должен вернуться в поток для запуска, но как это происходит и что это означает, зависит от того, какой код создан и принадлежит задаче.

Примечание: параллелизм можно выразить в терминах нескольких задач (если вы того пожелаете), но множественные задачи не подразумевают параллелизма.

В вашем случае: все зависит от того, что CanRun делает или является -и мы этого не знаем .Его также, вероятно, следует назвать CanRunAsync.

...