gpt4 book ai didi

C#:WAITING变量变为非空

转载 作者:行者123 更新时间:2023-11-30 22:49:48 25 4
gpt4 key购买 nike

.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 变量),但我想知道是否有更优雅的解决方案。

最佳答案

这种情况下更好的同步原语:

private ManualResetEvent mre = new ManualResetEvent(false);

private void OpenForm()
{
if (FormThread == null)
{
FormThread = new Thread(FormStub);
FormThread.SetApartmentState(ApartmentState.STA);
FormThread.Start();
mre.WaitOne();
}
}

private void FormStub()
{
Form = new ConnectorForm();
mre.Set();
Application.Run(Form);
}

关于C#:WAITING变量变为非空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/944766/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com