我開始玩弄.NET 4.5,尤其是異步/等待功能。奇怪的try..catch行爲與異步
我來到下面的代碼,這是我的驚喜,編譯。任何人都可以解釋我的原因嗎?
async Task SomeMethod()
{
try
{
await Task.Delay(1000);
}
catch
{
}
}
在以前的.NET版本中,編譯器會抱怨類似於「不是所有路徑都返回值」的消息。
我開始玩弄.NET 4.5,尤其是異步/等待功能。奇怪的try..catch行爲與異步
我來到下面的代碼,這是我的驚喜,編譯。任何人都可以解釋我的原因嗎?
async Task SomeMethod()
{
try
{
await Task.Delay(1000);
}
catch
{
}
}
在以前的.NET版本中,編譯器會抱怨類似於「不是所有路徑都返回值」的消息。
返回Task
的異步方法相當於返回void
的正常方法。這裏沒有特定的嘗試/抓住 - 不要忘記你的try
塊也不會返回任何東西!
所以你的代碼的非異步版本也只是:
void SomeMethod()
{
try
{
Thread.Sleep(1000)
}
catch
{
}
}
......顯然這將彙編。 (同樣明顯的是,這是可怕的使用使用裸catch
,但我認爲這不是真正的問題:)
這代碼不會編譯:
async Task<int> SomeMethod()
{
try
{
await Task.Delay(1000);
return 10;
}
catch
{
}
}
在回答你的問題Jon的回答,我將這些鏈接添加爲更好的可讀性作爲一個單獨的答案。
爲了得到幕後發生的事情更多的信息,我想指出你幫助我開始使用它的MSDN雜誌的這些文章:
MSDN 2011年10月問題:Parallel Programming with .NET
特別是前兩篇文章可能是您正在尋找的內容,因爲它們更好地描述了編譯器如何在內部重寫代碼以使async/ await
正常工作。
謝謝!這就是我一直在尋找的。 – dzendras
現在看起來很清楚。你能給我一個鏈接到一些文章,詳細討論在幕後,異步/等待發生什麼? – dzendras
@dzendras:MSDN會有很多,但你也可以閱讀我的Eduasync系列:http://msmvps.com/blogs/jon_skeet/archive/tags/Eduasync/default.aspx請注意,該功能隨時間變化很小。 –
謝謝,我會看看那些。 – dzendras