我目前正在嘗試解決初始化問題,該問題源於所有子組件同步初始化的假設。我可以使異步組件顯示爲同步嗎?
UI實例化一個擁有自己UI的類。它看起來是這樣的:
ConfWizard cf = new ConfWizard();
cf.ShowDialog();
麻煩的是,ConfWizard類利用該異步初始化另一個類的,但ShowDialog的被稱爲正確工作之前一定要準備好。該ConfWizard代碼看起來是這樣的:
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
}
由於助手的性質可能沒有設置直到ReadyEvent升起之前,目前的構造一般不正確初始化。將其餘的初始化放入helper_ReadyEvent似乎很明顯,但這會導致構造函數在對象準備好使用之前返回。由於使用ConfWizard對象的類假定一旦構造函數返回,對象完全可以使用,提前返回是不可取的。
不幸的是我不能更改HelperClass,所以我需要屏蔽它的異步行爲,以便ConfWizard類可以同步使用。
我嘗試使用ManualResetEvent對象(調用事件處理程序中的Set),但對WaitOne的調用被阻塞,因此事件不會掛起該應用程序。
有關如何在.NET1.1中實現這一點的任何想法?
更新 - 2009年8月21日
我有一段時間來嘗試今天,這裏是我發現的。
WaitOne - 如果給定足夠大的超時時間,則每次只需停止應用程序即可工作。不幸的是,超時時間至少需要5秒(比我等待的時間長)。沒有超時,它仍然掛起。調用set的事件根本不會發生。
睡覺 - 與WaitOne一樣,在足夠長的超時時間內它似乎工作。
線程 - 我不想讓UI繼續下去,直到完成初始化爲止,因爲UI的行爲被初始化結果改變了。但是,將HelperClass對象的初始化拆分爲單獨的線程並調用Thread.Join來暫停主線程。
所以這個問題的解決方案似乎是以正確的方式使用多個線程。
Wha?這要麼沒有道理,要麼我的大腦今天完全被炸了...... – 2009-08-18 21:36:11