我正在创建一个自动化测试运行应用程序。在应用程序的这一部分中,我正在开发一个轮询服务器。它的工作原理是不断轮询 Web 服务器以确定何时应运行新的自动化测试(对于我们的 GUI 应用程序的夜间自动运行)。
当轮询服务器看到请求时,它会下载所有必要的信息,然后在后台工作程序中执行测试运行。问题是测试运行的一部分有 OLE、COM 和其他调用(例如,Clipboard.Clear()
)发生在后台工作线程中。当发生这些调用之一时,会发生以下异常:
在进行 OLE 调用之前,当前线程必须设置为单线程单元 (STA) 模式。确保您的 Main 函数上标记有 STAThreadAttribute。
如何将后台工作线程标记为单线程单元?我的 Program.cs 中的 Main 调用显然已经具有该属性。
这是不可能的,BGW使用的是threadpool线程。 TP 线程始终是 MTA,无法更改。您必须使用常规线程,在启动之前调用 SetApartmentState()。该线程还应该泵送消息循环,调用Application.Run()。
也许您应该考虑从 UI 线程调用此代码。因为无论如何,COM 服务器很可能都在 UI 线程上运行其方法。从工作线程到创建 COM 服务器的 STA 线程的封送调用是自动的,COM 负责处理它。
或者不畏艰险,亲自指挥。你可以创建自己的STA线程来给服务器一个幸福的家。你会发现代码在这个帖子,请确保在您的 Initialize() 覆盖中创建 COM 对象。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)