如何在 C++/Cli 中使用可等待对象

How to consume an awaitable in C++/Cli

async/await 在过去几年中在 C# 世界中获得了很多人气。异步函数也倾向于在应用程序中迅速传播:需要等待可等待对象,因此调用函数必须是异步的,因此也是需要等待的可等待对象,...等等。

我在 C++/Cli 项目中使用 C# 库。该库公开了异步 API。 Visual C++ 编译器不支持 async/await。因此,我无法等待库提供给我的任何 API。

我有以下选择:

有什么方法可以让它工作吗?如果必须的话,我不介意同步执行异步 API。

对我来说,听起来你的问题更像是一个更大问题的征兆。我个人尽量避免将业务逻辑放在 C++-CLI 模块中。具体来说,我尝试将 ref class 功能限制在 3 个主要领域:

  • 将托管方法调用转换为本机方法调用(包括必要时转换参数)。
  • 将本机 return 值转换为托管 return 值。这甚至可以将接收回调的异步函数转换为 returning Task.
  • 方法
  • 将本机事件(回调)转换为托管事件。

我可能错了,但在你的情况下,你的 C++ 代码似乎没有很好地解耦,你最终将它的不同部分连接到 C++-CLI 模块中。

至于你的问题,我会使用 Task.ContinueWith 系列方法来执行异步延续,而不是 async / await。然而,如果您希望在特定 SynchronizationContext(例如 UI 线程)上调用延续,则必须特别注意提供正确的 TaskScheduler.