0

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

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

Main() 方法标有 [STAThread] 属性。该应用程序应该在没有窗口的情况下启动并侦听来自第三方数据上下文共享库的事件。当事件处理程序被触发时,我希望它创建并显示表单,如果还没有的话。该表单仅包含一个网络浏览器控件。

所以,我的问题是如何延迟应用程序的主窗体(带浏览器控件)的实例化,直到触发事件处理程序?

在这种情况下,我想我可以通过将表单传递给 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;
      }
  }

 ...
}
4

1 回答 1

2

您可能会发现直接实例化主窗体要容易得多,但要隐藏它,以免用户看到它。然后,当您想查看其中的内容时,您只需使其可见。

于 2009-09-03T19:30:17.390 回答