异步/等待限制

Ond*_*cek 4 c# async-await

使用async方法签名以及await在这些方法中使用表达式有什么其他限制,如果有的话?到目前为止,我知道标记的方法async只能有以下返回类型之一(可能还有更多?).

  • void
  • Task
  • Task<TResult>

Ste*_*ary 7

在我的博客上有一个介绍,你可能会觉得有帮助.

await只要求它传递一个"等待"的实例(匹配某个模式,类似于foreach工作方式).最常见的等待是任务,但还有其他(例如,Windows Store异步操作).

async必须在任何使用的方法上使用await.async方法必须返回TaskTask<T>,或者,如果你绝对必须,void.


Ree*_*sey 6

async修饰符只允许与返回类型的方法void,TaskTask<T>.一般情况下,它应该只对其中包括使用方法await操作.

await操作者可在任何类型的可用于其中(从C#语言规范,7.7.7):

t有一个名为GetAwaiter的可访问实例或扩展方法,没有参数,没有类型参数,以及一个返回类型A,以下所有内容都包含:

  • A实现接口System.Runtime.CompilerServices.INotifyCompletion
  • A具有bool类型的可访问,可读的实例属性IsCompleted
  • A具有可访问的实例方法GetResult,没有参数且没有类型参数

在实践中,这通常意味着你可以使用await任何Task,Task<T>,IAsyncOperation,IAsyncOperation<T>(从Windows商店API),以及其他一些选择类型的框架.