您好,
我在Application.Exit期间运行了以下代码:
if (InvokeRequired && this.IsHandleCreated)
{
this.Invoke(new Action(() => EndUpdate(Caller)));
return;
}
这会引发异常:在创建窗口句柄之前,无法在控件上调用Invoke或BeginInvoke ,但仅在应用程序正在激活时才会调用。
奇怪的是,当调试器因错误而中断时,我可以看到InvokeRequired和IsHandledCreated都设置为false,所以我不确定它是如何设法获取内部代码的(this.Invoke)?
在这种情况下,我只想关闭应用程序,没有任何例外。
答案 0 :(得分:0)
检查条件不是线程安全的。 首先,当线程在 if 运算符和调用之间切换时,您可以达到竞争条件。在其他情况下,我建议你在这里进行一些同步,但是不可能进入框架代码。
此外,调用将查询放入UI消息队列,然后UI线程将其从队列中提取并执行。同时,Invoke等待UI线程使用 Form.Handle 完成此查询。 因此,请确保您没有在 EndUpdate 方法中调用 Form.Close (),这可能会在等待时导致异常。
我建议您将 EndUpdate ()调用放在 Form.OnClosing ()覆盖中。这将是线程安全的,并且保证句柄存在。