在C#程序中异步运行C++代码
Running C++ code asynchronously in a C# program
我用C++编写了一些后端代码,并用C#编写了前端代码。我想让它在后台运行后端代码,这样我就可以做其他事情,比如更新进度条,但当我点击";启动";按钮,程序将挂起,直到完成后端代码的运行。
C#代码:
[DllImport("backend.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int executeBackend();
private async void startButton_Click(object sender, EventArgs e)
{
startButton.Enabled = false;
await StartProgram();
}
private async Task StartProgram()
{
int status = 0;
status = executeBackend(); //This is causing the UI to deadlock
startButton.Enabled = true;
}
backend.dll C++代码:
extern "C" {
__declspec(dllexport) int executeBackend()
{
int statusCode = 0;
//Do stuff in the background
return statusCode;
}
}
如果我注释掉运行executeBackend的调用,并将其替换为await Task.Delay(5000);
,则UI不会死锁。我该怎么解决这个问题?
您可以将对executeBackend
的调用封装在Task
中,以防止UI锁定。
var status = await Task.Run(() => executeBacked());
我还认为您对async
关键字的实际作用感到困惑。我认为您应该仔细阅读异步编程在dotnet中的工作原理。
您需要重新思考C++代码如何处理异步性
您应该能够向C++端传递一个回调函数,这样您就可以传递整个操作并返回一个Task
。
类似于此(请注意,StartProgram
函数使用TaskCompletionSource
,并且未标记为async
。(
[DllImport("backend.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern void executeBackend(BackendCallback func);
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate void BackendCallback(int result);
private Task<int> StartProgram()
{
var tcs = new TaskCompletionSource<int>();
BackendCallback callback = result =>
{
tcs.SetResult(result);
GC.KeepAlive(callback); // prevent GC from disposing unmanaged callback
};
executeBackend(callback);
return tcs.Task;
}
我对C++不够熟悉,无法向您展示这一面。
但本质上,您需要能够获取void (*) (int)
函数指针类型的参数,将操作交给另一个线程,然后在完成时使用函数指针回调C#端。
相关文章:
- 运行同一解决方案的另一个项目的项目
- CMake-按正确顺序将项目与C运行时对象文件链接
- 如何运行位于boost/libs/python/example/tutorial目录中的hello.cpp和Jamfil
- 代码在main()中运行,但在函数中出现错误
- 我在c++代码中生成了一个运行时#3异常
- 如何在linux终端中同时编译和运行c++代码
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 如何在运行中期切换GTK CSS style_context
- 如何在MS Visual Studio 2019中运行QT UI
- 如何通过cpp程序运行shell脚本
- IPC使用多个管道和分支进程来运行Python程序
- 删除指向指针的指针是运行时错误吗
- 如何用参数值调用函数(仅在运行时已知)
- 为什么即使使用-cudart-static进行编译,库用户仍然需要链接到cuda运行时
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- c++中的指针和运行时错误
- 在C应用程序中运行C++(带有STL)函数
- 运行程序时出现问题
- 控制允许动态运行c++的并发操作数
- 无法获取菜单选择以运行函数.C++