Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用C++/Cli_C#_.net_Async Await_C++ Cli - Fatal编程技术网

C# 如何使用C++/Cli

C# 如何使用C++/Cli,c#,.net,async-await,c++-cli,C#,.net,Async Await,C++ Cli,async/await在过去几年中在C#世界获得了大量的流行。异步函数也倾向于在应用程序中迅速传播:等待的函数需要等待,因此调用函数必须是异步的,因此也是需要等待的等待函数,。。。等等 我正在C++/Cli项目中使用C#库。该库公开异步API。Visual C++编译器不支持异步> /代码> /等待。因此,我无法等待库提供给我的任何API 我有以下选择: 调用异步函数并“放手”:这不是一个选项,因为我经常需要返回值才能继续 调用Wait()或访问Task/Task对象的Result属性,异步函

async
/
await
在过去几年中在C#世界获得了大量的流行。异步函数也倾向于在应用程序中迅速传播:等待的函数需要等待,因此调用函数必须是异步的,因此也是需要等待的等待函数,。。。等等

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

我有以下选择:

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

有什么办法可以让这一切顺利进行吗?如果必须的话,我不介意同步执行异步API。

对我来说,您的问题更像是一个更大问题的症状。我个人尽量避免将业务逻辑放在C++-CLI模块中。具体而言,我尝试将
ref类
功能限制在3个主要方面:

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

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


至于您的问题,我将使用
Task.ContinueWith
方法系列来执行异步继续,而不是
async/await
。但是,如果您希望在特定的
SynchronizationContext
(例如UI线程)上调用continuation,那么必须特别注意向我提供正确的
TaskScheduler
,,听起来您的问题更像是一个更大问题的症状。我个人尽量避免将业务逻辑放在C++-CLI模块中。具体而言,我尝试将
ref类
功能限制在3个主要方面:

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

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


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

;我想知道,从c++/CLI的角度看,您是否可以对
IAsyncResult
进行编译器封装?您是否尝试过使用
Windows::Foundation::IAsyncOperation
?事实是,您不能等待,必须处理方法调用的异步性质。任何试图使其同步的操作都会导致UI死锁或挂起。处理任何BeginXxx()调用都需要相同的编码模式,每个人在.NET 4.5之前编写的代码C++/CLI的一个选项是使用
Task.ContinueWith
。另一种方法是使用
Task.GetAwaiter().OnCompleted
,这与C#编译器的功能有点接近。@Dan:那当然很好。但这并不是那么简单。我们正在讨论一个数百万LoC的遗留MFC桌面应用程序。这里我不详细介绍,但在某些时候,我必须从现有的C++业务逻辑中调用异步函数。我想知道,从c++/CLI的角度看,您是否可以对
IAsyncResult
进行编译器封装?您是否尝试过使用
Windows::Foundation::IAsyncOperation
?事实是,您不能等待,必须处理方法调用的异步性质。任何试图使其同步的操作都会导致UI死锁或挂起。处理任何BeginXxx()调用都需要相同的编码模式,每个人在.NET 4.5之前编写的代码C++/CLI的一个选项是使用
Task.ContinueWith
。另一种方法是使用
Task.GetAwaiter().OnCompleted
,这与C#编译器的功能有点接近。@Dan:那当然很好。但这并不是那么简单。我们正在讨论一个数百万LoC的遗留MFC桌面应用程序。这里我不想详细说明,但在某些时候,我必须从现有的C++业务逻辑中调用异步函数。当然,当局部变量的生存期必须经过分割时,“分割函数”是非常重要的。@Nina Kaprez你说得对。我当时正在开发一个遗留的桌面应用程序(C++/MFC)。我们试图在应用程序中利用内部C#库,它们公开了等待的API。我们最终没有使用这些API。对,“拆分函数并在
wait
之后将部分传递给
ContinueWith
”,这正是C编译器对
async
方法的神奇之处。当然