[英]Does await Task.CompletedTask mean the async method will run synchronously?
[英]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);
}
或者使用await
和Task.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.