异步方法可以具有以下返回类型:
- 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 的操作的占位符。