本文摘录自CLR Via C# 第四版。
异步函数存在以下限制:
1、不能讲应用程序的Main方法转变成异步函数。另外,构造器、属性访问器方法和时间访问器方法不能转变成异步函数。
2、异步函数不能使用任何out或ref参数。
3、不能再catch,finally或unsafe快中使用await操作符。
4、不能再await操作符之前获得一个支持县城所有权或递归的锁,并在await操作符之后释放它。这是因为await之前的代码由一个线程执行,之后的代码则由另一个线程执行。在C# lock语句中使用await,编译器会报错。如果显式调用Minitor的Enter和Exit方法,那么代码虽然能编译,但Monitor.Exit会在运行时抛出一个SynchronizationLockException。
5、在查询表达式中,await操作符只能在初始from子句的第一个集合表达式中使用,或者在join子句的集合表达式中使用。