2012-08-22 105 views
3

我開始玩弄.NET 4.5,尤其是異步/等待功能。奇怪的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

在回答你的問題Jon的回答,我將這些鏈接添加爲更好的可讀性作爲一個單獨的答案。

爲了得到幕後發生的事情更多的信息,我想指出你幫助我開始使用它的MSDN雜誌的這些文章:

MSDN 2011年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