在 C# 应用程序退出时清理非托管 C++ 线程

Posted

技术标签:

【中文标题】在 C# 应用程序退出时清理非托管 C++ 线程【英文标题】:cleaning up unmanaged c++ thread on c# application exit 【发布时间】:2011-05-09 01:34:27 【问题描述】:

这是我的设置: 1) c# 应用程序启动并调用导出的非托管 c++ dll 函数 2) dll 函数通过 win32 CreateThread 产生一个线程 3) 这个新线程在 while 循环中“工作”,检查退出标志 当我退出 c# 应用程序时,线程立即退出。 问题: 1) 我该怎么做才能让我的线程在退出前进行清理? 非常感谢 - 我是 c# 世界的新手,但对 c++ 很有经验

【问题讨论】:

为什么不让 C# 应用设置退出标志并在应用退出时等待线程句柄? 也许这就是我所缺少的,如何在 c# 应用程序中捕获“退出”事件? @user371602 :每个 C# 应用程序都有一个 Main 入口点,就像 C++ 应用程序有 main 一样。作为简单的第一步,尝试将其内容包装在try..finally 中,然后等待finally 中的线程。几乎肯定有更好的方法,但这取决于应用程序的类型。安慰?赢表格? WPF? 【参考方案1】:

当您的 C# 应用退出时:

    设置对线程可见的标志。 在CreateThread 返回的HANDLE 上调用WaitForSingleObject。这将使它等待线程退出。 可以选择做一个好公民,并在线程的HANDLE 上调用CloseHandle 以释放其资源,但如果应用程序即将退出,这并不重要。 定期检查线程内的这个标志,看看它是否应该退出循环。

【讨论】:

以上是关于在 C# 应用程序退出时清理非托管 C++ 线程的主要内容,如果未能解决你的问题,请参考以下文章

从 C# 线程调用非托管代码

C# winForm Socket 多线程 编程 关闭问题

从非托管 c++ 调用 C# 函数(通过托管包装器)

非托管 C# 与 C++ [关闭]

C#:捕获混合托管/非托管进程的所有错误/异常

C# 使用多线程,在关闭窗体时 怎么关闭窗体的所有线程,使程序退出