.Net 奇怪的锁定语义再次困扰着我。
我正在启动一个线程,子线程依次启动一个表单。父线程应该等到表单创建完成。
我的第一次尝试是使用 Monitor 来观察 Form 变量:
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。
我可以很容易地创建一个虚拟整数或其他东西(我实际上认为我会canabalize FormThread 变量),但我想知道是否有更优雅的解决方案。