簡體   English   中英

為什么返回 Task.CompletedTask 無法在異步方法中編譯?

[英]Why returning Task.CompletedTask failed to compile in an async method?

我將 VS2019 和 dotnetcore 3.1 用於一個簡單的控制台應用程序,我有以下代碼:

public static async Task F()
{
    await Task.Delay(1000);
    return Task.CompletedTask; // error
}

它不編譯。 我只是創建一個方法,它是(1)異步的,(2)返回一個任務。 為什么這個 return 語句不能編譯? 如何修復它以滿足我對(1)和(2)的要求?

非常感謝。

await Task.Delay(1000); 方法已經創建並返回一個Task ,所以你可以寫

public static async Task F()
{
    await Task.Delay(1000);
}

或者使用awaitTask.CompletedTask;

public static async Task F()
{
    await Task.Delay(1000);
    await Task.CompletedTask;
}

否則你應該將返回類型更新為Task<Task> ,這沒有多大意義

public static async Task<Task> F()
{
    await Task.Delay(1000);
    return Task.CompletedTask;
}

您的方法可以在功能上濃縮為這一點。

public static Task F() 
{ 
  return Task.Delay(1000); 
}

返回Task.CompletedTask實例僅在以下情況下才有用:

  • 你不想使用async/await
  • 您的方法返回一個任務(如果您要使其不異步,則有效void
  • 您的代碼具有可能不會返回任務的邏輯

例子:

public static Task F() 
{ 
  if (someConditionToShortCircutTheMethod) 
      return Task.CompletedTask;

  // rest of logic
  return Task.Delay(1000); 
}

一旦您使您的方法async那么實際上正在返回 Task 的事實就被抽象出來了。 這可以使代碼更易於使用,尤其是在代碼等待 I/O 操作完成的多個點時。

public static async Task F() 
{ 
  if (someConditionToShortCircutTheMethod) 
      return;

  // rest of logic
  await Task.Delay(1000); 
  await Task.Delay(1000);
  // no return necessary, async Task has a similar flow as return type void
}

我還建議您查看以前的這些問題:

它不編譯。 我只是創建一個方法,它是(1)異步的,(2)返回一個任務。 為什么這個 return 語句不能編譯? 如何修復它以滿足我對(1)和(2)的要求?

async關鍵字將指示編譯器創建一個狀態機,該狀態機的工作是創建從該方法返回的Task 因此,如果您使用async則無需返回Task

public static async Task F()
{
  await Task.Delay(1000);
  return;
}

或等效地:

public static async Task F()
{
  await Task.Delay(1000);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM