背景: 以下のコードでは次の例外が発生します。WinFormsアプリケーションのイベントに応答するまで、メインフォームのインスタンス化を遅延させるにはどうすればよいですか?
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;
}
}
...
}