如何在C ++ / Cli中消耗等待

时间:2017-02-16 13:09:04

标签: c# .net async-await c++-cli

过去几年,

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

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

我有以下选择:

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

有没有办法让这项工作?如果必须的话,我不介意同步执行异步API。

1 个答案:

答案 0 :(得分:0)

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

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

我可能是错的,但是在您的情况下,听起来您的C ++代码没有很好地解耦,最终您将其不同部分连接到了C ++-CLI模块中。

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