异步方法可具有以下返回类型:
- Task:如果方法不含任何 return 语句或包含不返回操作数的 return 语句,则将 Task 用作返回类型;
- Task<TResult>:如果方法包含指定 TResult 类型操作数的 return 语句,将 Task<TResult> 指定为返回类型;
- void:对于除事件处理程序以外的代码,通常不鼓励使用async void方法,因为调用方不能await那些方法,并且必须实现不同的机制来报告完成或错误条件。
- 还可以指定任何其他返回类型,前提是返回类型包含GetAwaiter方法。
即GetAwaiter 方法返回的对象必须实System.Runtime.CompilerServices.ICriticalNotifyCompletion 接口。
例如,ValueTask<TResult>类型属于此类实现。可用于System.Thread.Tasks.Entensions的NuGet包方式可用。 - IAsyncEnumerable<T>(对于返回异步流的异步方法)
总结:
主要使用aysnc void返回类型来定义事件处理程序,这些处理程序需要此返回类型。异步事件处理程序通常用作异步程序的起始点。
aysnc void返回异步方法的调用不能等待,并且无法捕获该方法引发的异常。
aysnc void方法依法任何异常都会直接在SynchronizationContext(在async void 方法启动时处于活动状态)上引发
async Task与async Task<TResult>方法引发异常时,会捕获该异常,并将异常至于Task对象上。