挂钩线程退出

时间:2009-07-26 13:43:28

标签: com clr c++-cli multithreading sta

我有办法挂钩托管线程的退出(即在线程上运行一些代码,就在退出之前吗?)

我开发了一种挂钩线程退出的机制,适用于某些线程。步骤1:开发一个'hook'STA COM类,它接受一个回调函数并在其析构函数中调用它。步骤2:在我想要挂钩的线程上创建此对象的ThreadStatic实例,并将对象转换为非托管函数指针的托管委托。然后在线程退出时调用委托(因为CLR在所有STA COM RCW上调用IUnknown :: Release作为线程退出的一部分)。

此机制适用于我使用Thread类在代码中创建的工作线程。

但是,它似乎不适用于应用程序的主线程(无论是控制台还是Windows应用程序)。似乎在关机过程中删除了'hook'COM对象,并且调用委托的尝试失败。

(我想实现这个工具的原因是我可以在退出线程上运行一些本机COM代码,该线程与在线程上创建的STA COM对象一起工作,在它'太晚'之前(即在线程之前)退出,并且不再可能在该线程上使用STA COM对象。))

1 个答案:

答案 0 :(得分:0)

你控制线程创建吗?简单地将线程的代码包装在try ... finally子句中,并将代码放在finally中是最简单的。

请注意,当AppDomain关闭时,您永远无法确定是否会调用您的代码,因为关闭可能不够优雅。

当你说“析构函数”时,我认为你的意思是C ++ / CLI析构函数 - 即.Dispose()方法?

如果你需要在进程退出之前支持挂钩,你可以尝试AppDomain.CurrentDomain.ProcessExit事件 - 它似乎不会触发未处理的异常,或者AppDomain.CurrentDomain.UnhandledException似乎只触发一个未处理的例外。

这一切看起来都不是特别健壮,请注意......