我开始使用.NET 4.5,特别是async / await功能。
我来到下面的代码,令我惊讶,编译。任何人都能解释一下我的原因吗?
async Task SomeMethod()
{
try
{
await Task.Delay(1000);
}
catch
{
}
}
对于以前的.NET版本,编译器会抱怨类似于以下消息:“并非所有路径都返回值”。
答案 0 :(得分:5)
返回Task
的异步方法等同于返回void
的普通方法。这里没有尝试/特定于catch的内容 - 不要忘记您的try
块也不会返回任何内容!
所以代码的非异步版本就是:
void SomeMethod()
{
try
{
Thread.Sleep(1000)
}
catch
{
}
}
......显然会编译。 (同样显然,使用裸catch
是可怕的,但我认为这不是真正的问题:)
此代码无法编译:
async Task<int> SomeMethod()
{
try
{
await Task.Delay(1000);
return 10;
}
catch
{
}
}
答案 1 :(得分:1)
在回答你对Jon的回答的问题时,我将这些链接添加为单独的答案,以便更好地阅读。
为了获得有关幕后发生的更多信息,我想向您指出MSDN杂志上的这些文章,这些文章帮助我开始使用它:
MSDN 2011年10月号:Parallel Programming with .NET
特别是前两篇文章可能正是您所寻找的内容,因为它们更好地描述了编译器如何在内部重写代码以使async/ await
工作。