gpt4 book ai didi

c# - 我如何创建异步函数?

转载 作者:行者123 更新时间:2023-11-30 04:16:01 24 4
gpt4 key购买 nike

我的 C++ 类中有几个成员函数,我将它们打包为一个 dll并尝试在 C# 应用程序中使用它们。
我尝试通过简单地使用线程执行它们然后分离它们()来创建两个异步函数,这样它们就不会阻塞调用者线程直到它们结束。在基于 C++ 的应用程序中,每当我使用线程以这种方式调用函数时,它们都可以工作,但是当我尝试从 C# 调用我的异步函数之一时,我的应用程序崩溃或挂起!!
这些是我所谓的异步函数!:

void xGramManipulator::CreateMonoGramAsync()
{
thread t(&xGramManipulator::ReadMonoGram, this);
t.detach();
}

void xGramManipulator::CreateBiGramAsync()
{
thread t = thread(&xGramManipulator::ReadBiGram, this);
t.detach();
}

这是驻留在 dll 中的 c 中的包装函数:

//header
CDLL_API void CreateMonoGramAsync(void);
//cpp
CDLL_API void CreateMonoGramAsync(void)
{
xG.CreateMonoGramAsync();
}

这是调用该函数的 C# 应用程序:

 private void btnTest_Click(object sender, EventArgs e)
{
try
{
CreateBiGramAsync();
CreateMonoGramAsync();
}
catch (Exception)
{
}

}

我应该怎么做才能在我的类中拥有真正异步和非阻塞的成员函数?我在这里错过了什么?

最佳答案

我的猜测是您在将它们导入 C# 时没有指定调用约定 - 默认情况下 C# 将使用 stdcall 而 C++ 将导出为 cdecl。你必须:

[DllImport("CDll.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern void CreateMonoGramAsync();

或者,您当然可以在 C++ 中声明方法时指定 returntype __stdcall。我还假设您已经以其他方式正确声明了函数(使用 extern "C"__declspec(dllexport) 等)

关于c# - 我如何创建异步函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17935548/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com