Есть ли причина, по которой List <Task> не всегда работает параллельно?

2

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

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 чтобы заставить его работать в разных потоках.

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

  • 3
    Task не является Thread . На самом деле Task может работать в exat же Thread . Посмотрите на stackoverflow.com/questions/34375696/…
  • 0
    Список задач не запускается вообще. Это просто список объектов Task, которые на самом деле могут быть холодными. Что делает CanRun ? Он запускает какие-либо задачи или возвращает холодные задачи?
Показать ещё 13 комментариев
Теги:
asp.net-core
parallel-processing

1 ответ

12
Лучший ответ

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

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

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

  • 0
    Спасибо за ваш ответ. Итак, вы говорите, что не имеет значения, если я использую Task.Run или Task.Factory.StartNew или просто добавляю асинхронный метод непосредственно в список задач, нет гарантии, что они будут работать в разных потоках?
  • 1
    @ Алекс, нет, я не это говорю; эти вещи связаны с потоками, хотя нет никакой гарантии, сколько из них будет работать параллельно (это зависит от планировщика); Я отвечаю на вопрос в оригинальной форме, когда CanRun был расплывчатым: в общем случае : задача не означает поток.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню