2016-08-24 4 views
1

Я разрабатываю работу quartz.net, которая запускается каждые 1 час. Он выполняет следующий метод. Я вызываю webapi внутри цикла for. Я хочу, чтобы убедиться, что я возвращаюсь из метода GetChangedScripts() только после того, как весь поток завершен? Как это сделать или я сделал это правильно?C# как вызвать async ждут в цикле for

Работа метод

public void Execute(IJobExecutionContext context) 
{ 
    try 
    { 
     var scripts = _scriptService.GetScripts().GetAwaiter().GetResult(); 
    } 
    catch (Exception ex) 
    { 
     _logProvider.Error("Error while executing Script Changed Notification job : " + ex); 
    } 
} 

Услуги:

public async Task<IEnumerable<ChangedScriptsByChannel>> GetScripts() 
{ 
    var result = new List<ChangedScriptsByChannel>(); 
    var currentTime = _systemClock.CurrentTime; 
    var channelsToProcess = _lastRunReader.GetChannelsToProcess().ToList(); 

    if (!channelsToProcess.Any()) return result; 

    foreach (var channel in channelsToProcess) 
    { 
      var changedScripts = await _scriptRepository.GetChangedScriptAsync(queryString); 

      if (changedScriptsList.Any()) 
      { 
       result.Add(new ChangedScriptsByChannel() 
       { 
        ChannelCode = channel.ChannelCode, 
        ChangedScripts = changedScriptsList 
       }); 
      } 
    } 

    return result; 
} 

ответ

0

По состоянию на 8 дней назад был формальный announcement из команды Quartz.NET о том, что последняя версия, 3.0 Alpha 1 имеет полную поддержку для async и await. Я бы предложил перейти на это, если это вообще возможно. Это поможет вашему подходу в том, что вам не нужно будет делать .GetAwaiter().GetResult(), что обычно является запахом кода.

Как использовать await в петле?

Возможно, вы имели в виду цикл foreach, если вы это уже делаете. Если бы не изменение не было ничем разрушающим землю.

for (int i = 0; i < channelsToProcess.Count; ++ i) 
{ 
    var changedScripts = 
     await _scriptRepository.GetChangedScriptAsync(queryString); 

    if (changedScriptsList.Any()) 
    { 
     var channel = channelsToProcess[i]; 
     result.Add(new ChangedScriptsByChannel() 
     { 
      ChannelCode = channel.ChannelCode, 
      ChangedScripts = changedScriptsList 
     }); 
    } 
} 

Делая это либо в for или foreach цикле, хотя делает это в упорядоченных модах. Другим подходом было бы использовать Linq и .Select, чтобы наметить требуемые задачи, а затем использовать Task.WhenAll.

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