一些背景:我在下面的代码中得到以下异常 .
ThreadStateException:无法实例化ActiveX控件'8856f961-340a-11d0-a96b-00c04fd705a2',因为当前线程不在单线程单元中 .
Main()方法标有[STAThread]属性 . 应用程序应该在没有窗口的情况下启动,并从第三方数据上下文共享库中侦听事件 . 当触发事件处理程序时,我希望它创建并显示表单(如果尚未创建) . 表单只包含一个webbrowser控件 .
所以,我的问题是如何在触发事件处理程序之前延迟应用程序的主窗体(w / webbrowser控件)的实例化?
在这个例子中,我想我可以通过将表单传递给ApplicationContext构造函数来创建表单然后隐藏它,但我真的很好奇为什么这不起作用 .
[STAThread]
static void Main() {
ListenerAppContext context = new ListenerAppContext();
Application.Run(context);
}
...
public class ListenerAppContext : ApplicationContext {
ThirdPartyDataContextAdapter adapter;
string UrlFormat = "http://ViewDataHere/?{0}";
public ListenerAppContext() {
adapter = new ThirdPartyDataContextAdapter();
adapter.OnSomeEvent += new OnSomeEventHandler(adapter_OnSomeEvent);
}
void adapter_OnSomeEvent(string data) {
ShowData(data);
}
void ShowData(string data) {
string url = String.Format(UrlFormat, data);
if (this.MainForm == null) {
this.MainForm = new ReportViewer(url); // Exception thrown here
} else {
((IReportView)this.MainForm).Url = url;
}
}
...
}
1 回答
您可能会发现更容易继续并立即实例化主窗体,但隐藏它以便用户看不到它 . 然后,当你想看到那里有什么时,你就可以看到它 .