C# 如何延迟主窗体的实例化,直到响应WinForms应用程序中的事件?
一些背景: 我在下面的代码中得到以下异常 ThreadStateException:无法实例化ActiveX控件“8856f961-340a-11d0-a96b-00c04fd705a2”,因为当前线程不在单线程单元中 Main()方法用[StatThread]属性标记。 应用程序应该在没有窗口的情况下启动,并侦听来自第三方数据上下文共享库的事件。当触发eventhandler时,我希望它创建并显示表单(如果还没有)。表单只包含一个webbrowser控件 所以,我的问题是,在触发事件处理程序之前,如何延迟应用程序主窗体(w/webbrowser控件)的实例化 在本例中,我想我可以通过将表单传递给ApplicationContext构造函数从一开始就创建表单,然后将其隐藏,但我真的很好奇为什么这样做不起作用C# 如何延迟主窗体的实例化,直到响应WinForms应用程序中的事件?,c#,.net,winforms,webbrowser-control,sta,C#,.net,Winforms,Webbrowser Control,Sta,一些背景: 我在下面的代码中得到以下异常 ThreadStateException:无法实例化ActiveX控件“8856f961-340a-11d0-a96b-00c04fd705a2”,因为当前线程不在单线程单元中 Main()方法用[StatThread]属性标记。 应用程序应该在没有窗口的情况下启动,并侦听来自第三方数据上下文共享库的事件。当触发eventhandler时,我希望它创建并显示表单(如果还没有)。表单只包含一个webbrowser控件 所以,我的问题是,在触发事件处理程序之
[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;
}
}
...
}