0

背景: 以下のコードで次の例外が発生します。

ThreadStateException : 現在のスレッドがシングルスレッド アパートメントにないため、ActiveX コントロール '8856f961-340a-11d0-a96b-00c04fd705a2' をインスタンス化できません。

Main() メソッドは [STAThread] 属性でマークされています。アプリは、ウィンドウなしで起動し、サード パーティのデータ コンテキスト共有ライブラリからのイベントをリッスンすることになっています。イベントハンドラーがトリガーされたときに、フォームがまだ作成されていない場合は、フォームを作成して表示したいと思います。フォームには、単に Web ブラウザー コントロールが含まれています。

それで、私の質問は、イベント ハンドラーがトリガーされるまで、アプリケーションのメイン フォーム (Web ブラウザー コントロールを含む) のインスタンス化をどのように遅らせるかということです。

この例では、最初からフォームを 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 に答える