私は現在、すべてのサブコンポーネントが同期して初期化されるという仮定から生じる初期化の問題を解決しようとしています。非同期コンポーネントを同期させることはできますか?
UIは独自のUIを持つクラスをインスタンス化します。それは次のようになります。
ConfWizard cf = new ConfWizard();
cf.ShowDialog();
トラブルがConfWizardクラスは非同期的に初期化し、別のクラスを使用していますが、ShowDialogをが正しく機能するために呼び出される前に準備ができていなければならないということです。 ReadyEventが発生する直前に、現在のコンストラクタは、一般的に正しく初期化しないまでヘルパーのプロパティを設定することはできませんので
public ConfWizard()
{
helper = new HelperClass
helper.ReadyEvent += new HelperClass.ReadyEventHandler(this.helper_ReadyEvent)
helper.StartUp();
// Do more initialization using properties of hc
}
private helper_ReadyEvent()
{
//HelperClass is ready to use
}
:ConfWizardコードは次のように見えます。残りの初期化をhelper_ReadyEventに入れるのは明らかですが、コンストラクタがオブジェクトを使用できるようになる前に戻すことになります。 ConfWizardオブジェクトを使用するクラスは、コンストラクタがオブジェクトを完全に使用できるように戻すと仮定しているため、早期返却は望ましくありません。
残念ながら私はHelperClassを変更できないため、何らかの理由でConfWizardクラスを同期して使用できるように非同期動作をマスクする必要があります。
(イベントハンドラでSetを呼び出す)ManualResetEventオブジェクトを使用しようとしましたが、WaitOneの呼び出しがブロックされているため、イベントがアプリケーションをハングして処理されません。
.NET1.1でこれを達成する方法についてのアイデアはありますか?
UPDATE - Aug 21、2009
今日は実験する時間がありましたが、ここに私が見つけたものがあります。
WaitOne - アプリケーションを停止するだけで、十分なタイムアウトが毎回有効になります。残念なことに、タイムアウトは少なくとも5秒(私が待つ気にかない)以上にする必要があります。タイムアウトがなければ、それでもハングアップします。セットを呼び出すイベントは決して起こらない。
スリーピング - WaitOneと同じですが、タイムアウトが十分に長くなると動作するように見えます。
スレッディング - UIの動作が初期化の結果によって変更されるため、初期化が完了するまでUIを継続しないようにします。ただし、HelperClassオブジェクトの初期化を別のスレッドに分割し、Thread.Joinを呼び出してメインスレッドを一時停止させます。
問題への解決策は、正しい方法で複数のスレッドを使用しているようです。
?それは意味をなさないか、または私の脳は今日完全に揚げられています.... –