1

你好,

我有以下在 Application.Exit 期间运行的代码:

            if (InvokeRequired && this.IsHandleCreated)
            {
                this.Invoke(new Action(() => EndUpdate(Caller)));
                return;
            }

这会引发异常:在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke,但只能在应用程序正在运行时调用。

奇怪的是,当调试器因错误而中断时,我可以看到 InvokeRequired 和 IsHandledCreated 都设置为 false,所以我不确定它是如何访问内部代码(this.Invoke)的?

在这种情况下,我只想关闭应用程序,没有任何异常。

4

1 回答 1

0

以这种方式检查条件不是线程安全的。首先,当线程在if运算符和调用Invoke之间切换时,您可以达到竞争条件。在其他情况下,我建议您在此处放置一些同步,但不可能进入框架代码。

此外,Invoke将查询放入 UI 消息队列,然后 UI 线程将其从队列中提取并执行。同时,Invoke 使用Form.Handle等待 UI 线程完成执行此查询。因此,请确保您没有在EndUpdate方法中调用Form.Close () ,这可能会导致等待时出现异常。

我只是建议您将EndUpdate () 调用放在Form.OnClosing () 覆盖中。那将是线程安全的,并且Handle保证存在。

于 2012-06-29T11:47:58.750 回答