对于一个程序来说returns Task是什么意思return什么都没有?

For a procedure that returns Task what does it mean to return nothing?

考虑声明为 return 任务对象的方法 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# 编译器根本不会抱怨裸体 "return",即使它不是 returning 一个 "Task" 对象。为什么这是允许的?下面发生了什么? C# 是否在此处为 return 制作了一个 Task 对象?

方法签名上的 async 关键字将方法的编译更改为一种状态机,使其成为 return 一个 Task,当您的方法代码完成时完成。仅存在该关键字就意味着您的方法代码被翻译成更复杂的编译代码。

如果您完全熟悉 yield return 关键字,则原理类似。

是的,对于 async 方法编译器自动生成 Task 结果。无法通过 async 方法手动 return Task

请注意,在您的示例中,如果 "preliminary code" 没有 await,您不需要标记方法 async 并且可以 return 自己完成任务:

public Task Foo()
{

    // some synchronous code (no await)
    ...
    if (someCondition)
    { 
       return Task.FromResult(0);
    }
    return SomeOtherMethodThatReturnsTask();
}

如果在方法 completed.That 时没有返回有意义的值,则使用任务,调用方法 returns 是一个任务,但是当任务完成时,任何正在等待的 await 表达式任务评估为无效。

async (C# Reference)