对于返回Task的过程,什么都不返回?

时间:2016-03-08 21:13:24

标签: c# task-parallel-library

考虑声明为返回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对象?

3 个答案:

答案 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完成时,任何等待任务的等待表达式都会返回到空隙。

async (C# Reference)