Sco*_*ain 9 .net c# asynchronous async-await
你可以等待 C#5+中的任何内容,只要该类型具有一个被调用的函数.GetAwaiter(),它返回一个特殊对象或者具有相同的扩展方法.
Unity3d在其下一个主要版本中将支持async/await.目前在Unity3d中你可以yield return null;在一个协程里面代表"等待下一帧".
我想知道是否有可能制作一个扩展方法,允许你做await null;同样的行为.没有System.Null像有一个System.Void,所以我想不出在扩展方法中放入什么类型.
你是正确的,收益率和等待是密切相关的.两者都是当前方法暂停的工作流中的点,控制返回给调用者,并且该方法在将来发生yield/await时在未指定的点恢复.
但是他们在操作上的行为方面却截然不同.它们实际上是彼此的双重身份.当迭代序列的代码要求时,yield 提供新值.await 在由异步执行任务生成时提取值.
Null是一个完全有效的值,因此将它提供给调用者的收益是有意义的.但是null不是一个有效的任务,因此等待尝试从任务中提取值是没有意义的.
目前在Unity3d中,您可以返回null; 在协程内部表示"等待下一帧".
在async-await异步工作流中,模拟yield return null;就是return null;.这意味着"通过提供空引用来结束异步工作流的这一部分".如果您打算生成结果为null的任务,为什么不简单地返回null?
让我换一种可能更清楚的方式.显然这毫无意义:
foreach(var x in null)
Console.WriteLine(x);
Run Code Online (Sandbox Code Playgroud)
这是完全荒谬的:
var x = await null;
Console.WriteLine(x);
Run Code Online (Sandbox Code Playgroud)
逻辑上这些是相同的.Foreach表示"只要值可用,就从序列中提取值",但null不是序列.类似地,"await"意味着"一旦值可用就从任务中提取值",但null不是任务.
这是关键:异步模拟await不是yield return,它是foreach.这是T从IEnumerable<T>或中提取的机制Task<T>.该放的东西T 进入的单子类型yield return的IEnumerable<T>和return为Task<T>.
无法在文字 null 上定义扩展方法,因为文字null没有类型:
\n\n\n..我们意识到 null 类型很奇怪。它是一种只有一个值 \xe2\x80\x94 的类型还是?nullable int 的值真的与 null string 的值相同吗?并且可空值类型的值 don\xe2\x80\x99t 已经有一个类型,即可空值类型?
\n
和:
\n\n\n\n因此,我们在 C# 3.0 规范中删除了对无用的 \xe2\x80\x9cnull 类型\xe2\x80\x9d 的引用。
\n