异步方法可以具有以下返回类型:
- Task:对于执行操作但不返回任何值的异步方法。
- Task:对于返回值的异步方法。
void:对于事件处理程序。- 任何具有可访问的
GetAwaiter方法的类型。由GetAwaiter方法返回的对象必须实现 System.Runtime.CompilerServices.ICriticalNotifyCompletion 接口。 - IAsyncEnumerable:对于返回异步流(async stream)的异步方法。
有关异步方法的详细信息,参阅 Asynchronous programming with async and await。
还有几种特定于 Windows 工作负载(work loads)的类型存在:
- DispatcherOperation, 适用于仅限于 Windows 的异步操作。
- IAsyncAction, 适用于 UWP 中不返回值的异步操作。
- IAsyncActionWithProgress, 适用于 UWP 中只报告进度但不返回值的异步操作。
- IAsyncOperation, 适用于 UWP 中返回值的异步操作。
- IAsyncOperationWithProgress<TResult,TProgress>, 适用于 UWP 中既报告进度(progress)又返回值的异步操作。
Task 返回类型(Task return type)#
异步方法如果不包含 return 语句,或者 return 语句没有返回操作数,则通常具有 Task 返回类型。如果它们以同步方式运行,则返回 void。如果在异步方法中使用 Task 返回类型,调用该方法的方法可以使用 await 运算符来挂起调用者的完成,直到被调用的异步方法完成。
在下面的示例中,WaitAndApologizeAsync 方法不包含 return 语句,因此该方法会返回一个 Task 对象。通过返回 Task 类型使得 WaitAndApologizeAsync 可以被等待。Task 类型不包括 Result 属性,因为它没有返回值。
public static async Task DisplayCurrentInfoAsync()
{
await WaitAndApologizeAsync();
Console.WriteLine($"Today is {DateTime.Now:D}");
Console.WriteLine($"The current time is {DateTime.Now.TimeOfDay:t}");
Console.WriteLine("The current temperature is 76 degrees.");
}
static async Task WaitAndApologizeAsync()
{
await Task.Delay(2000);
Console.WriteLine("Sorry for the delay...\n");
}
// Example output:
// Sorry for the delay...
//
// Today is Monday, August 17, 2020
// The current time is 12:59:24.2183304
// The current temperature is 76 degrees.
WaitAndApologizeAsync 方法使用 await 语句而不是 await 表达式进行等待,类似于同步无返回值(synchronous void-returning)方法的调用语句。在这种情况下,使用 await 操作符不会产生值。当 await 的右操作数是 Task 时,await 表达式会产生 T 的结果。
你可以将对 WaitAndApologizeAsync 方法的调用与应用 await 运算符分开,如下面的代码所示。但请记住,Task 没有 Result 属性,并且在将 await 运算符应用于 Task 时不会产生任何值。
以下代码将调用 WaitAndApologizeAsync 方法与等待该方法返回的 Task 分开。
Task waitAndApologizeTask = WaitAndApologizeAsync();
string output =
$"Today is {DateTime.Now:D}\n" +
$"The current time is {DateTime.Now.TimeOfDay:t}\n" +
"The current temperature is 76 degrees.\n";
await waitAndApologizeTask;
Console.WriteLine(output);
Task 返回类型(Task return type)#
Task 返回类型用于包含 return 语句的异步方法,其中的操作数是 TResult。
在下面的示例中,GetLeisureHoursAsync 方法包含一个返回整数的返回语句。方法声明必须指定返回类型为 Task。FromResult 异步方法是返回 DayOfWeek 的操作的占位符。