IsHandledCreated设置为false但在运行时它被设置为true?

时间:2012-06-29 07:58:53

标签: c# winforms multithreading

您好,

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

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

这会引发异常:在创建窗口句柄之前,无法在控件上调用Invoke或BeginInvoke ,但仅在应用程序正在激活时才会调用。

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

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

1 个答案:

答案 0 :(得分:0)

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

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

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