考虑声明为返回Task对象的方法Foo()
public async Task Foo()
{
try
{
// some preliminary code that can throw exceptions
}
catch (Exception e)
{
// do something about the error but we do not want
// to propogate it up.
return;
}
await SomeOtherMethodThatReturnsTask();
}
C#编译器根本没有抱怨裸“返回”,即使它没有返回“任务”对象。为什么允许这样做?这下面发生了什么? C#是否在这里返回一个Task对象?
答案 0 :(得分:3)
方法签名上的async
关键字将您的方法编译更改为一种状态机,使其返回在您的方法代码完成时完成的Task
。仅存在该关键字意味着您的方法代码被转换为更复杂的编译代码。
如果您完全熟悉yield return
关键字,那么它就是一个类似的原则。
答案 1 :(得分:1)
是的,对于async
方法,编译器会自动生成Task
个结果。无法从Task
方法手动返回async
。
请注意,如果“初步代码”没有await
,您的示例中不需要标记方法async
并且可以自行返回任务:
public Task Foo()
{
// some synchronous code (no await)
...
if (someCondition)
{
return Task.FromResult(0);
}
return SomeOtherMethodThatReturnsTask();
}
答案 2 :(得分:0)
如果在方法完成时没有返回有意义的值,则使用Task。也就是说,对方法的调用返回一个Task,但是当Task完成时,任何等待任务的等待表达式都会返回到空隙。