2014-10-05 3 views
1

원하는 작업 :루프 반복마다 작업 대기 중

나는 매 x 초마다 특정 작업 순서를 수행하는 타이머가있는 서비스를 가지고 있습니다. 어떤 경우에는 액션 중 하나를 기다려야합니다 (실제 시나리오에서는 채팅 서버를 통한 누군가의 답변입니다).

내가 작품 아래에 시도 무엇, 유일한 문제는 이 코드 조각 내용 : inital 대기 시간 후, 그냥 모든 두 번째 행을두고

string result = await WaitAsynchronouslyAsync(); 

만, 처음 기다려온됩니다

여기

내 코드입니다 (이 내가 원하는 것이 아니다) :

static void Main(string[] args) 
     { 
      _timer.Start(); 
      _timer.Interval = 1000; 
      _timer.Elapsed += _timer_Elapsed; 
      _timer.Enabled = true; 
      Console.Read(); 
     } 

     static async void _timer_Elapsed(object sender, ElapsedEventArgs e) 
     { 
      //this has to be done every second, regardless of the await below    
      Console.WriteLine(DateTime.Now + " - " + "Current iteration: " + GetNumber++); 

      //this needs to be awaited everytime (in real life this is waiting for a response from a user) 
      string result = await WaitAsynchronouslyAsync(); 
      Console.WriteLine(result); 
     } 

     public static async Task<string> WaitAsynchronouslyAsync() 
     { 
      await Task.Delay(5000); 
      var x = GetAsyncNumber ++; 
      return x.ToString(); 
     } 

기본적으로 내가 원하는 것을 await 기능입니다 ide _timer_Elapsed 메서드는 매초마다 (매 초마다 5 초 동안 대기해야 함) 발생하며 5 초 동안 한 번만 수행 한 다음 매 초마다 발생합니다. 내가 Task.WhenAll()와 함께 몇 가지 것을 시도했지만 나는 정말로 그것을 이해하지 못하고 또한 내가 필요로하지 않습니다.

+5

'await' *은 5 초 동안 기다리고 있습니다. 단지 5 개의 "동시"가 1 초 간격으로 흩어져 있기를 기다리고 있습니다. 따라서 처음 5 초가 지나면 각 결과가 각각 '대기'됩니다. 그 후 두 번째. –

+0

@DecadeMoon 고맙습니다. 전에 그렇게 생각하지 않았습니다. 당신이 대답으로 게시하면 받아 들일 것입니다. – Thousand

답변

1

_timer_Elapsed 메서드는 매 초마다 호출되고 WaitAsynchronouslyAsync() 메서드 호출에 대한 응답으로 새 비동기 작업을 시작할 때마다 호출됩니다. 이 비동기 작업은 완료하는 데 5 초가 걸리고 매 초마다 새로운 비동기 작업이 생성되기 때문에 한 번에 최대 5 개의 동시 * 작업을 실행하게됩니다. 그런 다음 첫 번째 비동기 작업이 완료되면 (5 초 후) 두 번째 비동기 작업은 완료되기 전에 1 초 남았습니다. 등등.

여기에서 중요한 점은 여러 개의 비동기 작업이 동시에 실행되며 _timer_Elapsed 메서드는 이전 호출에서 실행될 수있는 비동기 작업과 상관없이 항상 매초마다 호출된다는 것입니다. 또한 _timer_ElapsedTask을 반환하지 않으며 이벤트 처리기이기 때문에 여기서는 사용할 수 없습니다. 따라서 호출자는 메서드 내부에서 시작된 비동기 작업에 대해 알지 못합니다. 메서드는 작업이 완료되기 전에 반환됩니다.

*이 작업은 반드시 별도의 스레드에서 실행되지 않을 수 있으므로 여기서 "동시"라는 단어를 사용하고 있습니다. 자세한 내용은 this을 참조하십시오.