Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何延迟主窗体的实例化,直到响应WinForms应用程序中的事件?_C#_.net_Winforms_Webbrowser Control_Sta - Fatal编程技术网

C# 如何延迟主窗体的实例化,直到响应WinForms应用程序中的事件?

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控件 所以,我的问题是,在触发事件处理程序之

一些背景: 我在下面的代码中得到以下异常

ThreadStateException:无法实例化ActiveX控件“8856f961-340a-11d0-a96b-00c04fd705a2”,因为当前线程不在单线程单元中

Main()方法用[StatThread]属性标记。 应用程序应该在没有窗口的情况下启动,并侦听来自第三方数据上下文共享库的事件。当触发eventhandler时,我希望它创建并显示表单(如果还没有)。表单只包含一个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;
      }
  }

 ...
}