0

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

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

例如,这种机制适用于我使用 Thread 类在代码中创建的工作线程。

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

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

4

1 回答 1

0

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

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

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

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

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

于 2009-07-26T14:09:15.287 回答