首页 文章

如何在WinForms应用程序中响应事件之前,如何延迟主窗体的实例化?

提问于
浏览
0

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

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 回答

  • 2

    您可能会发现更容易继续并立即实例化主窗体,但隐藏它以便用户看不到它 . 然后,当你想看到那里有什么时,你就可以看到它 .

相关问题