2012-08-22 3 views
3

.NET 4.5, 특히 async/await 기능을 가지고 놀고 있습니다.이상한 try..catch 비동기 동작

저는 아래 코드를 보았습니다.이 코드는 제 생각에 컴파일합니다. 아무도 내 이유를 설명 할 수 있습니까?

async Task SomeMethod() 
{ 
    try 
    { 
     await Task.Delay(1000); 
    } 
    catch 
    { 

    } 
} 

이전 .NET 버전에서는 "모든 경로가 값을 반환하지 않음"과 유사한 메시지가 표시됩니다.

답변

5

Task을 반환하는 비동기 메서드는 void을 반환하는 일반 메서드와 같습니다. 여기서 시도하거나 잡기에 특별한 것은 없습니다. try 블록이 아무 것도 반환하지 않는다는 것을 잊지 마십시오!

void SomeMethod() 
{ 
    try 
    { 
     Thread.Sleep(1000) 
    } 
    catch 
    { 
    } 
} 

... 그리고 분명 그 컴파일 것 :

그래서 코드의 비 비동기 버전은 될 것이다. (마찬가지로 분명히, 그것은 사용 베어 catch를 사용하는 끔찍한하지만 난 그

코드는 컴파일되지 않습니다 정말 질문 : 아니다 가정

async Task<int> SomeMethod() 
{ 
    try 
    { 
     await Task.Delay(1000); 
     return 10; 
    } 
    catch 
    { 

    } 
} 
+0

이제 명확하게 보입니다. 비공식적 인/기다리고있는 일들을 배경으로 세부적인 사항을 논의하는 기사에 대한 링크를 제게 줄 수 있습니까? – dzendras

+0

@dzendras : MSDN에는 많은 것이 있지만 내 Eduasync 시리즈를 읽을 수도 있습니다. http://msmvps.com/blogs/jon_skeet/archive/tags/Eduasync/default.aspx 기능이 약간 변경되었습니다. . –

+0

고마워, 나는 그것들을 살펴볼 것이다. – dzendras

1

을 대응 존의에 질문에 대답, 나는 별도의 답변으로 더 나은 가독성을 위해 이러한 링크를 추가합니다.

무대 뒤에서 일어나는에 대한 추가 정보를 얻기 위해 나는 당신에게 내가 그것을 시작하기 도왔은 MSDN 잡지에서이 기사를 가리 키도록하고 싶습니다 : 2011

MSDN 10 월 문제 : Parallel Programming with .NET

  1. Pause and Play with Await
  2. Async Performance: Understanding the Costs of Async and Await
  3. Easier Asynchronous Programming with the New Visual Studio Async CTP

특히 처음 두 기사는 컴파일러가 내부적으로 코드를 다시 작성하여 async/ await 작업을 더 잘 수행하는 방법을 설명 할 때 찾고있는 것일 수 있습니다.

+0

감사! 그게 내가 찾고 있던거야. – dzendras