是否有可能等待空文字?

时间:2017-01-04 00:08:05

标签: c# .net asynchronous async-await

你可以在C#5+中await anything,只要该类型有一个名为.GetAwaiter()的函数,它返回一个特殊对象或者具有相同的扩展方法。

Unity3d在其下一个主要版本中将支持async / await。目前在Unity3d中,您可以在协程中yield return null;代表"等待下一帧"。

我想知道是否有可能制作一个允许你await null;来获得相同行为的扩展方法。没有System.Null就像有System.Void一样,所以我想不出要在扩展方法中放入什么类型。

2 个答案:

答案 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。这是从foreachT中提取IEnumerable<T>的机制。将Task<T> 置于 monadic类型的内容是T的{​​{1}}和yield return的{​​{1}}。

答案 1 :(得分:3)

由于literal null has no type

,因此无法在文字null上定义扩展方法
  

..我们意识到null类型很奇怪。这是一种只有一个价值的类型 - 或者是它? null nullable int的值是否与null字符串的值真的相同?而且可空值类型的值是否已经有一个类型,即可空值类型?

  

因此,我们删除了对C#3.0规范中无用的“null类型”的引用。