如何在 C++/Cli 中使用可等待对象
How to consume an awaitable in C++/Cli
async
/await
在过去几年中在 C# 世界中获得了很多人气。异步函数也倾向于在应用程序中迅速传播:需要等待可等待对象,因此调用函数必须是异步的,因此也是需要等待的可等待对象,...等等。
我在 C++/Cli 项目中使用 C# 库。该库公开了异步 API。 Visual C++ 编译器不支持 async
/await
。因此,我无法等待库提供给我的任何 API。
我有以下选择:
- 调用异步函数和 "letting it go":不是一个选项,因为我经常需要 return 值才能继续。
- 调用
Wait()
或访问 Task
/Task<T>
对象的 Result
属性 异步函数 returns: [= UI 线程的 18=]。
有什么方法可以让它工作吗?如果必须的话,我不介意同步执行异步 API。
对我来说,听起来你的问题更像是一个更大问题的征兆。我个人尽量避免将业务逻辑放在 C++-CLI 模块中。具体来说,我尝试将 ref class
功能限制在 3 个主要领域:
- 将托管方法调用转换为本机方法调用(包括必要时转换参数)。
- 将本机 return 值转换为托管 return 值。这甚至可以将接收回调的异步函数转换为 returning
Task
. 方法
- 将本机事件(回调)转换为托管事件。
我可能错了,但在你的情况下,你的 C++ 代码似乎没有很好地解耦,你最终将它的不同部分连接到 C++-CLI 模块中。
至于你的问题,我会使用 Task.ContinueWith
系列方法来执行异步延续,而不是 async / await
。然而,如果您希望在特定 SynchronizationContext
(例如 UI 线程)上调用延续,则必须特别注意提供正确的 TaskScheduler
.
async
/await
在过去几年中在 C# 世界中获得了很多人气。异步函数也倾向于在应用程序中迅速传播:需要等待可等待对象,因此调用函数必须是异步的,因此也是需要等待的可等待对象,...等等。
我在 C++/Cli 项目中使用 C# 库。该库公开了异步 API。 Visual C++ 编译器不支持 async
/await
。因此,我无法等待库提供给我的任何 API。
我有以下选择:
- 调用异步函数和 "letting it go":不是一个选项,因为我经常需要 return 值才能继续。
- 调用
Wait()
或访问Task
/Task<T>
对象的Result
属性 异步函数 returns: [= UI 线程的 18=]。
有什么方法可以让它工作吗?如果必须的话,我不介意同步执行异步 API。
对我来说,听起来你的问题更像是一个更大问题的征兆。我个人尽量避免将业务逻辑放在 C++-CLI 模块中。具体来说,我尝试将 ref class
功能限制在 3 个主要领域:
- 将托管方法调用转换为本机方法调用(包括必要时转换参数)。
- 将本机 return 值转换为托管 return 值。这甚至可以将接收回调的异步函数转换为 returning
Task
. 方法
- 将本机事件(回调)转换为托管事件。
我可能错了,但在你的情况下,你的 C++ 代码似乎没有很好地解耦,你最终将它的不同部分连接到 C++-CLI 模块中。
至于你的问题,我会使用 Task.ContinueWith
系列方法来执行异步延续,而不是 async / await
。然而,如果您希望在特定 SynchronizationContext
(例如 UI 线程)上调用延续,则必须特别注意提供正确的 TaskScheduler
.