早上好,
我做了一个简单的dll,我使用WebBrowser控件来完成一些简单的任务。现在我想在单独的Task或BackgroundWorker中使用主UI中的方法。问题是每当我使用这些方法时,我都会得到“不STAThread
”异常......我怎样才能解决这个问题?当然,在dll中没有Main()
方法,我也不能将STAThread
属性添加到构造函数中。
非常感谢。
答案 0 :(得分:4)
好吧,要在新的STA线程中运行代码,您应该创建一个新线程并在启动之前使用Thread.SetApartmentState
显式强制它成为STAThread。然后,您需要使用Control.BeginInvoke
将调用封送回UI线程 - 您不想使用BackgroundWorker
或Task
,因为这些将使用线程池线程。
另一方面,目前尚不清楚在这种情况下这是否会有所帮助 - 如果你使用WebBrowserControl
,你可能需要运行消息循环等。
“使用主UI中的方法”并不清楚你的意思。这是在正常UI线程中运行的UI的WebBrowserControl 部分吗?如果是这样,你需要将编组到来自另一个线程的线程(例如使用Control.BeginInvoke
) - 而另一个线程不需要是一个STA线程来实现这一点