2016-08-12 3 views
1

У меня есть следующий код, и я не уверен, что он будет запускать задачи по одному или одновременно запускать все из них и ждать для всех из них закончить.Ожидайте список задач по одному за раз

Dictionary<TemporaryAdditionalData, Exception> rejected = new Dictionary<TemporaryAdditionalData, Exception>(); 

    await Task.WhenAll(additionalData 
     .SelectMaybe(async adda => 
      await this.InsertTemporallyAdditionalData(
       guid, adda.Order, adda.ID, adda.Value, adda.IsMandatory 
      ), 
      out rejected 
     ).ToArray() 
    ); 

    return rejected; 

Я думаю, что метод SelectMaybe здесь не имеет значения, это всего лишь расширение LINQ-х Select, который автоматически перехватывает исключения и возвращает их.

1) Задачи будут выполняться один за другим или одновременно в одно и то же время?

2) Каким бы ни был ответ на вопрос 1, как я могу написать тот же код, чтобы сделать обратное?

+1

Запустите код и узнайте сами, что он делает. Это достаточно простой тест. – Servy

+0

@Servy Я попробую, мне, возможно, придется придумать более простую версию той же логики, поскольку у меня нет ресурсов прямо сейчас, чтобы протестировать эту конкретную реализацию. –

+0

Это был бы лучший способ проверить это поведение, да. – Servy

ответ

3

Задачи будут выполняться параллельно. Если вы хотите, чтобы они выполнялись последовательно, вы можете написать простой цикл следующим образом:

foreach (var adda in additionalData) 
{   
    try 
    { 
     await this.InsertTemporallyAdditionalData(
      guid, adda.Order, adda.ID, adda.Value, adda.IsMandatory 
     ); 
    } 
    catch (Exception ex) 
    { 
     rejected[adda] = ex; 
    } 
} 
+0

К сожалению, это не сработает. По какой-то причине они все равно выполняются в параллалле - это может быть подтверждено EF, взорвавшимся с «Вторая операция, запущенная в этом контексте до завершения предыдущей асинхронной операции» из-за ее единственной операции асинхронного управления потоком. Есть идеи? – Marchy

Смежные вопросы