【问题标题】:Can async-await be available in other .NET languages besides C#?除了 C# 之外,async-await 是否可以在其他 .NET 语言中使用?
【发布时间】:2014-07-23 21:27:22
【问题描述】:

async-await 模式是 .NET 4.5 和 C# 5.0 中更强大的补充之一

据我所知,它目前仅在 C# 和 VB 中可用。

此 API 是 .NET CLR 还是 C# 编译器本身的功能?

我真正要问的是——我们是否应该期待其他 .NET 语言中的 async/await,例如:

  • C++(通过 C++/CLI)
  • Python(通过 IronPython)
  • PHP(通过 Phalanger)
  • JavaScript(通过 IronJS)

请注意,我问的不是一般的异步编程,而是异步等待模式的细节(同步编写的异步代码)。

【问题讨论】:

标签: c# .net clr async-await


【解决方案1】:

此 API 是 .NET CLR 还是 C# 编译器本身的功能?

这是编译器的一个特性。支持 asyncawait 不需要 CLR 更改。需要扩展其他语言以支持它。没有什么可以阻止编译器这样做,但必须在编译器和语言本身中进行更改。

C++ 确实通过task/then 支持一些asynchrony in Windows Store applications,尽管它不如C# 和VB 中的async/await 关键字有用。

据我所知,目前仅在 C# 和 VB 中可用

请注意,F# 还支持async(这比 C# 和 VB.Net 版本早了很多)。它与 C# 样式的异步支持不同,但相似(并启发了 C# 和 VB.Net 团队)。

【讨论】:

  • 既然 async-await 被移植到 Mono,他们是移植编译本身还是依赖 Microsoft 编译器?
  • @talkol 他们在 Mono 的编译器中自己实现了它。它只是根据一些定义的规则转换为状态机。无需更改 CLR 支持。
  • 如果他们自己移植编译,他们怎么能这么快呢?这整个模式似乎是 MS 中一些优秀工程师的巨大努力。我没想到它会这么容易被复制
  • @talkol 您已链接到 Jon Skeet 发表的一篇博客文章,他在其中描述了如何实现其中的大部分内容。这在 C# 5.0 发布之前就已经出现了;它基于测试版。
  • @talkol 它实际上建立在 .NET 4 中 BCL 中存在的许多内容之上。最棘手的部分是设计方法 - 一旦方法存在重新实现它是复杂的,但并不可怕,因为它基本上只是一个大型状态机。
【解决方案2】:

C# 和 VB.Net 编译器通过将原始方法转换为状态机来实现 await 模式。这与 F# 异步/工作流模式的工作原理非常相似。这种类型的转换在任何以 CLR 为目标的语言中都是可能的。

【讨论】:

    【解决方案3】:

    这是编译器的一个特性,需要 BCL 支持。

    例如,有一个 NuGet package 允许您通过添加语言支持利用的各种 API(例如 Task.GetAwaiter)从 .NET 4.0 使用它。

    它在概念上类似于 yield return,这是任何语言都可以实现的另一个编译器功能。

    【讨论】:

      【解决方案4】:

      您可以查看Visual C++ Compiler November 2013 CTP,一些漂亮的示例可以执行以下操作: __await FileIO::WriteTextAsync(file, file->Name);

      它看起来还不是很好,而且很可能会在未来的版本中出现标准的发展、新的和更好的(至少是标准的)方法。

      【讨论】:

        猜你喜欢
        • 2010-09-15
        • 1970-01-01
        • 2016-04-02
        • 2016-11-16
        • 1970-01-01
        • 1970-01-01
        • 2011-02-12
        • 2019-04-30
        • 2011-11-14
        相关资源
        最近更新 更多