我有一个使用 COM 组件的 C# 应用程序。这个 COM 组件需要一个消息泵 (Application.Run()) 来完成它的处理。这意味着它被卡在主线程上。但我最近发现可以在另一个线程上启动另一个 Application.Run,它有自己的 ApplicationContext。
所以我想将 COM 组件托管在它自己的 Application.Run() 内的自己的线程上,但我不知道如何在不创建 UI 表单的情况下在新线程上开始工作。
我需要与线程通信的 WindowsFormsSynchronizationContext 直到 Application.Run() 才会创建。但是一旦 Application.Run() 被调用,我就无法弄清楚如何获得 SynchronizationContext。如果我可以只在该线程上引发一个事件,我可以使用它来引导整个事情(创建 COM 对象等),但似乎没有任何地方可以在没有表单的情况下挂钩到新的事件循环.
我已经尝试过各种复杂的事情,比如安装消息过滤器(在新线程上不会引发任何消息),将执行上下文复制到另一个线程并尝试从那里检索 SynchronizationContext(它拒绝复制 ExecutionContext已经运行线程),在启动 Application.Run() 然后调用 DoCallbBack() 之前检索 Thread.CurrentContext (DoCallback 最终在原始线程上)等等。我尝试过的没有任何效果。