除了C#之外,async await还能在其他.NET语言中使用吗
本文关键字:语言 NET 其他 之外 async await 除了 | 更新日期: 2023-09-27 18:29:34
异步等待模式是对.NET 4.5和C#5.0 更强大的补充之一
据我所知,它目前只在C#和VB中可用。
此API是.NET CLR的功能还是C#编译器本身的功能?
我真正想问的是,我们是否应该在其他.NET语言中使用async/await,例如:
- C++(通过C++/CLI)
- Python(通过IronPython)
- PHP(通过Phalanger)
- JavaScript(通过IronJS)
请注意,我问的不是一般的异步编程,而是异步等待模式(异步代码,以同步编写)的细节。
此API是.NET CLR的功能还是C#编译器本身的功能?
这是编译器的一个特性。不需要CLR更改即可支持async
和await
。其他语言需要扩展才能支持它。没有什么可以阻止编译器这样做,但它必须在编译器和语言本身中进行更改。
C++确实通过task
/then
在Windows应用商店中支持一些异步,尽管它不如C#和VB中的async
/await
关键字可用。
据我所知,它目前只在C#和VB中可用
请注意,F#还支持async
(它比C#和VB.Net版本早很多)。它不同于C#风格的异步支持,但相似(并启发了C#和VB.Net团队)。
C#和VB.Net编译器通过将原始方法转换为状态机来实现await
模式。这与F#异步/工作流模式的工作方式非常相似。这种类型的转换在任何以CLR为目标的语言中都是可能的。
这是编译器的一个功能,需要BCL支持。
例如,有一个NuGet包允许您通过添加语言支持所利用的各种API(例如Task.GetAwaiter)从.NET 4.0中使用它。
它在概念上类似于yield return,这是任何语言都可以实现的另一个编译器功能。
您可以查看Visual C++编译器2013年11月的CTP,其中有一些很好的例子可以做以下事情:__等待FileIO::WriteTextAsync(文件,文件->名称);
它看起来还没有那么好,而且很可能在未来的版本中会出现标准不断发展、新的、更好的(至少是标准的)方法。