为什么返回 Task.CompletedTask 无法在异步方法中编译?

Tro*_*yvs 4 c# asynchronous task async-await

我使用 VS2019 和 dotnetcore 3.1 作为一个简单的控制台应用程序,我有这个代码片段:

public static async Task F()
{
    await Task.Delay(1000);
    return Task.CompletedTask; // error
}
Run Code Online (Sandbox Code Playgroud)

它无法编译。我只是创建一个 (1) 异步方法,(2) 返回一个任务。为什么这个 return 语句不能编译?如何修复它以满足我的(1)和(2)要求?

多谢。

Igo*_*gor 7

您的方法在功能上可以简化为这样。

\n\n
public static Task F() \n{ \n  return Task.Delay(1000); \n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

仅当满足以下条件时,返回Task.CompletedTask实例才有用:

\n\n
    \n
  • 你不想使用async/await
  • \n
  • 您的方法返回一个任务(void如果您要使其不是异步的,则有效)
  • \n
  • 您的代码具有可能不会返回任务的逻辑
  • \n
\n\n

例子:

\n\n
public static Task F() \n{ \n  if (someConditionToShortCircutTheMethod) \n      return Task.CompletedTask;\n\n  // rest of logic\n  return Task.Delay(1000); \n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

一旦你创建了你的方法async,那么任务实际上被返回的事实就被抽象出来了。这可以使代码更易于使用,特别是当代码有多个点等待 I/O 操作完成时。

\n\n
public static async Task F() \n{ \n  if (someConditionToShortCircutTheMethod) \n      return;\n\n  // rest of logic\n  await Task.Delay(1000); \n  await Task.Delay(1000);\n  // no return necessary, async Task has a similar flow as return type void\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

我还建议回顾一下之前的这些问题:

\n\n\n


Pav*_*ski 5

await Task.Delay(1000);方法已经创建并返回 a Task,所以你可以写

public static async Task F()
{
    await Task.Delay(1000);
}
Run Code Online (Sandbox Code Playgroud)

或者await与使用Task.CompletedTask;

public static async Task F()
{
    await Task.Delay(1000);
    await Task.CompletedTask;
}
Run Code Online (Sandbox Code Playgroud)

否则你应该将返回类型更新为Task<Task>,这没有多大意义

public static async Task<Task> F()
{
    await Task.Delay(1000);
    return Task.CompletedTask;
}
Run Code Online (Sandbox Code Playgroud)