首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在C++/Cli中使用可使用的

如何在C++/Cli中使用可使用的
EN

Stack Overflow用户
提问于 2017-02-16 13:09:03
回答 1查看 5.7K关注 0票数 6

在过去的几年里,async/await在C#世界中得到了很大的普及。异步函数也倾向于在应用程序中迅速扩展:需要等待awaitable,因此调用函数必须是异步的,因此也是一个可等待的函数,.以此类推。

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

我有以下选择:

  • 调用异步函数并“放手”:这不是一个选项,因为我经常需要返回值才能继续。
  • 调用Wait()或访问异步函数返回的Task/Task<T>对象的Result属性: UI线程的Causes the infamous dead-lock

有什么办法让这件事成功吗?如果有必要,我不会介意同步执行异步API。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-27 21:11:18

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

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

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42274911

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档