2009-07-26 81 views
0

有没有办法,我勾管理线程的出口(即运行一个线程一些代码,其退出前?)挂钩线程退出

我已经开发了挂钩线程退出一个可行的机制为部分线程。第1步:开发一个'hook'STA COM类,它接受一个回调函数并在析构函数中调用它。第2步:在我想挂钩的线程上创建一个ThreadStatic实例,并将该对象的托管代理转换为非托管函数指针。该代理然后调用线程退出(因为CLR在所有STA COM RCW上调用IUnknown :: Release作为线程退出的一部分)。

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

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

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

回答

0

您是否控制线程创建?简单地将线程的代码包装在try ... finally子句中,并将代码放入终端中可能最简单。

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

当你说“析构函数”时,我假定你是指C++/CLI析构函数 - 即.Dispose()方法?

如果您需要支持的进程退出之前挂钩,你可以试试AppDomain.CurrentDomain.ProcessExit事件 - 这似乎并没有开枪未处理的异常,或AppDomain.CurrentDomain.UnhandledException这似乎只对未处理的异常火灾。

没有一个看起来特别健壮,不介意你......

+0

第1段:没有。第2段:是的,但没问题。第3段:否,本地C++实现的coclass的析构函数。第4段:嗯,我会检查一下。第5段:尽管如此。 – mackenir 2009-07-26 14:39:31