【问题标题】:Hooking thread exit挂钩线程退出
【发布时间】:2009-07-26 13:43:28
【问题描述】:

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

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 第 1 段:不。第 2 段:是的,但没问题。第 3 段:不,本机 C++ 实现的 coclass 的析构函数。第 4 段:嗯,我会检查一下。第 5 段:尽管如此。
    • 不幸的是,AppDomain ProcessExit 在与主线程不同的线程上被调用。
    猜你喜欢
    • 2019-07-04
    • 2020-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多