你可以在C#5+中await anything,只要该类型有一个名为.GetAwaiter()
的函数,它返回一个特殊对象或者具有相同的扩展方法。
Unity3d在其下一个主要版本中将支持async / await。目前在Unity3d中,您可以在协程中yield return null;
代表"等待下一帧"。
我想知道是否有可能制作一个允许你await null;
来获得相同行为的扩展方法。没有System.Null
就像有System.Void
一样,所以我想不出要在扩展方法中放入什么类型。
答案 0 :(得分:9)
你是对的,收益率和等待是密切相关的。两者都是工作流中的点,当前方法暂停,控制返回给调用者,并且该方法在将来发生yield / await时在未指定的点恢复。
但他们对自己的操作数的行为却截然不同。它们实际上是彼此的 duals 。当迭代序列的代码要求时,yield 提供一个新的值。 await 在异步执行任务生成时提取值。
Null是一个完全有效的值,因此将yield提供给调用者是有意义的。但是null不是有效的任务,因此等待尝试从任务中提取值是没有意义的。
目前在Unity3d中,您可以返回null;在协程中代表"等待下一帧"。
在async-await异步工作流中,export class ProdutoListaPage {
public produto: Array<string>;
private url: string = "http://localhost:50907/api/consulta/BuscaProduto";
constructor(public navCtrl: NavController, public navParams: NavParams, public http:Http) {
this.http.get(this.url).map(res => res.json())
.subscribe(data => {
this.produto = data.data.children;
});
}
ionViewDidLoad() {
console.log('ionViewDidLoad ProdutoListaPage');
}
}
的模拟只是yield return null;
。这意味着&#34;通过提供空引用&#34;来结束异步工作流的这一部分。如果您打算生成结果为null的任务,为什么不简单地返回null?
让我换一种可能更清楚的方式。显然这没有道理:
return null;
这是完全荒谬的:
foreach(var x in null)
Console.WriteLine(x);
逻辑上这些是相同的。 Foreach意味着&#34;只要值可用且#34;从序列中提取值,但null不是序列。同样地,&#34;等待&#34;表示&#34;一旦值可用,就从任务中提取值&#34;,但null不是任务。
这是关键:var x = await null;
Console.WriteLine(x);
的异步模拟不是await
,而是yield return
。这是从foreach
或T
中提取IEnumerable<T>
的机制。将Task<T>
置于 monadic类型的内容是T
的{{1}}和yield return
的{{1}}。
答案 1 :(得分:3)
..我们意识到null类型很奇怪。这是一种只有一个价值的类型 - 或者是它? null nullable int的值是否与null字符串的值真的相同?而且可空值类型的值是否已经有一个类型,即可空值类型?
和
因此,我们删除了对C#3.0规范中无用的“null类型”的引用。