只要类型有一个名为.GetAwaiter()
的函数返回特殊对象或具有执行相同操作的扩展方法,您就可以在C# 5+中等待任何内容。
Unity3d在其下一个主要版本中将支持async/await。目前在Unity3d中,您可以在协程中使用yield return null;
表示“等待下一帧”。
我想知道是否可能创建一个扩展方法,允许您执行await null;
以获得相同的行为。由于没有像System.Void
那样的System.Null
,因此我无法想到要放入扩展方法的类型。
只要类型有一个名为.GetAwaiter()
的函数返回特殊对象或具有执行相同操作的扩展方法,您就可以在C# 5+中等待任何内容。
Unity3d在其下一个主要版本中将支持async/await。目前在Unity3d中,您可以在协程中使用yield return null;
表示“等待下一帧”。
我想知道是否可能创建一个扩展方法,允许您执行await null;
以获得相同的行为。由于没有像System.Void
那样的System.Null
,因此我无法想到要放入扩展方法的类型。
yield return null;
的类比就是return null;
。这意味着“通过提供空引用来结束此部分异步工作流程”。如果您打算生成结果为null的任务,为什么不简单地返回null呢?foreach(var x in null)
Console.WriteLine(x);
var x = await null;
Console.WriteLine(x);
yield return
之后通常会有代码。例如,如果您希望循环每帧重复一次直到满足条件,可以使用 while(_condition) { Foo(); yield return null; }
。Unity3d 滥用了 IEnumerator
来创建自己的异步/await 系统 - 协同程序(在 async/await 出现之前就被创造出来了)。 - Scott Chamberlainyield return new WaitForSeconds(5);
,这相当于 await Task.Delay(TimeSpan.FromSeconds(5));
。 - Scott ChamberlainIObservable<T>
,你需要响应式扩展。 - Eric Lippertnull
没有类型:
我们意识到 null 类型非常奇怪。它是一个只有一个值的类型——或者说它是吗?null 可空 int 的值是否真的与 null 字符串的值相同?可空值类型的值已经有了类型,即可空值类型本身。
并且:
因此,我们在 C# 3.0 规范中删除了对无用的“null类型”的引用。
static Whatever Foo(this object x) { ... } ... null.Foo();
是完全合法的;null
可以转换为object
,这就是所需的全部。现在,你会遇到static Whatever Foo<T>(this T x)
的问题,因为现在null.Foo()
无法为T推断类型,但无论如何,我们已经用Foo(null);
解决了这个问题。不,null.Foo()
被禁止是因为它闻起来很糟糕;如果你试图在空字面量上放置扩展方法,你几乎肯定做错了什么。 - Eric Lippert
await Task.Yield()
吗? - spenderpublic static YieldAwaitable GetAwaiter(this ???? temp) { return Task.Yield(); }
我只是不知道????
部分是否有可能出现问题。 - Scott Chamberlainawait Task<object>.CompletedTask()
或 FromResult<T>。 - M.kazem Akhgary