.Net的奇怪的鎖定語義再次困擾着我。C#:等待變量變爲非空
我正在啓動一個線程,子線程依次啓動一個窗體。父線程應等到表單創建完畢。
我第一次嘗試使用監視器來監視表單變量:
private void OpenForm()
{
if (FormThread == null)
{
Monitor.Enter(Form);
FormThread = new Thread(FormStub);
FormThread.SetApartmentState(ApartmentState.STA);
FormThread.Start();
Monitor.Wait(Form);
Monitor.Exit(Form);
}
}
private void FormStub()
{
Form = new ConnectorForm();
Monitor.Enter(Form);
Monitor.PulseAll(Form);
Monitor.Exit(Form);
Application.Run(Form);
}
...這會拋出異常。 Monitor.Enter()失敗,因爲Form == null。我可以很容易地創建一個虛擬整數或其他東西(我真的認爲我會調整FormThread變量),但我想知道是否有更優雅的解決方案。
看起來他想從其他經營他的主要應用循環由於某種原因,線程...? – jerryjvl 2009-06-03 13:36:36
小問題是它讓我不用擔心主線程的線程模型,以及它是否支持表單。更大的好處是主線程獲得控制權返回給它,並且可以像單線程一樣執行操作,而此表單位於另一個線程中,並保持用戶進行娛樂和通知。我希望主線程的最終API非常好。 – Thanatos 2009-06-03 14:15:03