一尘不染

如何将后台工作线程设置为“单线程单元”?

c#

我正在创建一个自动测试运行的应用程序。在应用程序的这一部分中,我正在使用轮询服务器。它通过不断轮询Web服务器来确定何时应运行新的自动化测试(对于我们的GUI应用程序的夜间自动化运行)来工作。

当轮询服务器看到请求时,它将下载所有必需的信息,然后在后台工作程序中执行测试运行。问题在于,测试运行的一部分Clipboard.Clear()在后台工作线程中具有OLE,COM和其他调用(例如,)。当发生这些调用之一时,将发生以下异常:

必须先将当前线程设置为单线程单元(STA)模式,然后才能进行OLE调用。确保您的Main函数上已标记STAThreadAttribute。

如何将后台工作线程标记为单线程单元?我的Program.cs中的Main调用显然已经具有该属性。


阅读 570

收藏
2020-05-19

共1个答案

一尘不染

这是不可能的,BGW使用线程池线程。TP线程始终是MTA,无法更改。您将必须使用常规线程,在启动之前调用SetApartmentState()。此线程还应该泵送消息循环,调用Application.Run()。

也许您应该考虑从UI线程调用此代码。因为很有可能,COM服务器始终在UI线程上运行其方法。从工作线程到创建COM服务器的STA线程的封送调用是自动的,COM负责。

或以公牛欺负自己。您可以创建自己的STA线程,以使服务器拥有幸福的家。您将在本文中找到代码,请确保在您的Initialize()覆盖中创建COM对象。

2020-05-19