2016-08-24 5 views
1

나는 1 시간마다 실행되는 quartz.net 작업을 개발 중이다. 다음 메소드를 실행합니다. for 루프 안에 webapi를 호출합니다. 모든 스레드가 완료된 후에 GetChangedScripts() 메서드에서 반환 할 수 있는지 확인하려면? 이 작업을 수행하거나 올바르게 수행 했습니까?C# 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

Quartz.NET 팀의 공식 announcement 최신 버전, 3.0 Alpha 1이 완벽하게 지원한다는 있었다 팔일 전에 현재 asyncawait입니다. 가능한 한 업그레이드하는 것이 좋습니다. 이렇게하면 일반적으로 코드 냄새 인 .GetAwaiter().GetResult()을 수행 할 필요가 없다는 점에서 접근 방법을 도울 수 있습니다.

for 루프에서 await을 어떻게 사용할 수 있습니까?

이미 수행 중이라면 foreach 루프를 의미 했습니까? 변화가 없다면 지구가 산산조각 날 것입니다. 하지만 중 하나 for 또는 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 
     }); 
    } 
} 

는 직렬화 된 방식으로 그렇게하고있다. 또 다른 방법은 Linq.Select을 사용하여 원하는 작업을 매핑 한 다음 Task.WhenAll을 사용하는 것입니다.

관련 문제