2016-09-13 6 views
-3

두 가지 비동기 방법의 차이점은 무엇입니까? 그렇지 않다면 어떤 상황에서이 두 가지 방법이 다를 수 있습니까?두 비동기 메서드의 차이점은 무엇입니까?

감사합니다.

public async Task<int> MyMethod1Async() 
{ 
    return 1; 
} 

public async Task<int> MyMethod2Async() 
{ 
    return await new Task<int>(() => 1); 
} 
+2

비동기 코드가 없으므로 첫 번째 것은 비동기가되지 않습니다 .... –

+2

async/await 작동 방식에 대한 근본적인 질문은 가치가 있지만 단순화 된 양식은 다음과 같으므로이 주제를 오프 토픽으로 닫으려고합니다. 결함. 심지어 예제 중 하나가 비동기 적이기 때문에 중복 질문을 가리키는 것조차 어렵습니다. – Guvante

+0

언제 실제로 MyMethod2Async에서 작업을 실행합니까? 새 작업을 만들면됩니다. – EJoshuaS

답변

1

다음

public async Task<string> MyMethod1Async() 
    { 
     using (HttpClient client = new HttpClient()) 
     { 
      client.BaseAddress = new Uri("SomeBaseAddress"); 

      // This will return control to the method's caller until this gets a result from the server 
      HttpResponseMessage message = await client.GetAsync("SomeURI"); 

      // The same as above - returns control to the method's caller until this is done 
      string content = await message.Content.ReadAsStringAsync(); 

      return content; 
     } 
    } 
:

는 다음 방법은 아마도 비동기의 서로 다른 "종류"의 차이의 더 나은 그림입니다
public int MyMethod1() 
{ 
    return 1; 
} 

이와 같은 코드가 반드시 추가 스레드를 생성 할 필요는 없습니다 (Microsoft가 이러한 특정 라이브러리 호출을 구현 한 방법을 제외하고). 어느 쪽이든,/async는 이 아니며,은 추가 스레드를 생성해야합니다. 동일한 스레드에서 비동기 적으로 실행할 수 있습니다.

이 사실에 대한 나의 표준 그림은 다음과 같습니다. 당신이 10 인의 레스토랑을 가지고 있다고 가정하십시오. 웨이터가 오면, 그가 주문한 첫 번째 사람은 준비가되지 않았습니다. 그러나 다른 9 명은 있습니다. 따라서 웨이터는 다른 9 명에게 주문을 물어 본 다음 주문할 준비가되기를 원하면 원래의 사람에게 돌아옵니다. (그것은 분명히 그들이 원래의 남자가 주문할 준비가되어있을 때까지 기다리는 두 번째 웨이터를 가지게 될 것이므로 아마도 어쨌든 많은 시간을 절약하지 못할 것입니다.) 이것이 async/await가 많은 경우에 작동하는 방법입니다 (Thread.Run (...)과 같은 Task Parallel 라이브러리 호출 중 일부는 실제로 이 다른 스레드에서 실행됨을 나타냅니다.) -이 그림에서는 두 번째 웨이터를 가져옵니다 - 어떤 문서인지 확인하십시오.

방금 ​​작업을 생성하기 때문에 작동하지 않습니다 목록 다음 항목은 실제로 그것으로 아무것도하지 않습니다

public async Task<int> MyMethod2Async() 
{ 
    return await new Task<int>(() => 1); 
} 

을 내가 실제로 그런 짓을하도록 겠지 다음은 :

public async Task<int> MyMethod2Async() 
{ 
    return await Task.Run<int>(() => 1); 
} 

이, 스레드 풀에서 람다 식을 실행 람다 표현식이 결과를 가질 때까지 MyMethod2Async의 호출자에게 컨트롤을 반환 한 다음 그 결과를 가지고 일단 람다 식의 값을 반환합니다.

요약하면 차이점은 동일한 스레드 (다른 모든 사람이 주문한 후에 웨이터에게 그에게 돌아 오라고 말한 테이블의 첫 번째 남성과 동일)에서 비동기로 실행하는지, 아니면 작업을 별도의 스레드에서 수행 할 수 있습니다.

지나치게 단순화 할 위험이 있으므로 CPU 기반 작업은 일반적으로 백그라운드 스레드에서 비동기 적으로 실행되어야합니다.그러나 IO 바인딩 작업 (또는 홀드 업이 대부분 외부 시스템의 결과를 기다리는 경우)은 종종 동일한 스레드에서 비동기 적으로 실행될 수 있습니다. 같은 스레드에서 비동기 적으로 수행하는 것보다 백그라운드 스레드에 퍼팅하는 것에서 성능 향상을 많이 얻을 필요는 없습니다.

+0

주의 사항 downvote 설명해 주시겠습니까? – EJoshuaS

1

첫 번째 방법은 1Result와 이미 완성 된 작업을 반환합니다.

두 번째 방법은 결코 완료되지 않을 Task<int>을 반환합니다. - 그냥 1 반환 그냥 일을했다면보다가 다를 바 없다, 그래서 거기에 더 "기다리고 있습니다"사업자가 없기 때문에

public async Task<int> MyMethod1Async() 
{ 
    return 1; 
} 

이 동 기적으로 실행됩니다 : 두 가지 방법을 살펴보면

관련 문제