2016-08-17 4 views
0

두 개의 장기 실행 작업을 병렬로 실행 한 다음 결과를 얻는 방법이 올바르지 않고 대신 async/await를 사용하는 것이 유리한 지 궁금합니다.두 작업을 수행하는 올바른 방법

 public int DoStuff() 
     { 
      var res1 = Task.Run(() => LongRunning1()); 
      var res2 = Task.Run(() => LongRunning2()); 

      Task.WhenAll(res1, res2); 
      return res1.Result + res2.Result; 
     } 

     int LongRunning1() 
     { 
      Thread.Sleep(30); 
      return 10; 
     } 

     int LongRunning2() 
     { 
      Thread.Sleep(10); 
      return 20; 
     } 
+1

두 가지 장기 실행 작업 중에 다른 작업이 있습니까? –

+2

오래 실행되는 oprations IO 또는 CPU가 바인딩되어 있습니까? –

답변

4

이렇게 병렬로 작업을 실행하는 것이 좋습니다. WhenAll 행은 아무 작업도 수행하지 않고 제거 할 수 있습니다. 또한 ResultAggregateException에 예외를 래핑합니다. 병렬 코드를 실행할 때 이것은 정상입니다. ,

async Task<int> LongRunning1Async() 
{ 
    await Task.Delay(30); 
    return 10; 
} 

async Task<int> LongRunning2Async() 
{ 
    await Task.Delay(10); 
    return 20; 
} 

public async Task<int> DoStuffAsync() 
{ 
    var res1 = LongRunning1Async(); 
    var res2 = LongRunning2Async(); 

    return await res1 + await res2; 
} 

나 : 작업 (예는, I/O를 바인딩) 자연적으로 비동기 경우

public int DoStuff() 
{ 
    var res1 = Task.Run(() => LongRunning1()); 
    var res2 = Task.Run(() => LongRunning2()); 

    return res1.Result + res2.Result; 
} 

그러나, 당신은 대신 병렬 코드의 동시 비동기 코드를 할 수있는 다른 방법으로는 :

public async Task<int> DoStuffAsync() 
{ 
    var res1 = LongRunning1Async(); 
    var res2 = LongRunning2Async(); 

    var results = await Task.WhenAll(res1, res2); 
    return results[0] + results[1]; 
} 
+0

작업은 http 요청입니다. async/await이 여전히 권장됩니까? .Result 접근법과 비교하여 이점은 무엇입니까? – Cyan

+1

@Cyan : HTTP 요청은 I/O이므로 병렬 처리 대신 비동기 동시성을 사용해야합니다. 장점은 같은 결과를 얻기 위해 더 적은 수의 스레드를 사용한다는 것입니다. –

+0

질문이 하나 더 있습니다. @Stephen : 블로그에 http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html이 표시됩니다. 결과가 교착 상태를 유발할 수 있습니다. 왜 위의 코드에서 그렇지 않습니까? – Cyan

관련 문제