我的InvokeRequied#2出了什么问题?

Ato*_*Hic 3 .net c# multithreading invokerequired

第一个主题是我的InvokeRequied什么问题

我按照他向我推荐的答案,但我发现了一个新问题.

下图的结果是跨线程异常.

我的代码出了什么问题?

如何解决这个问题呢 ?

在此输入图像描述

Yah*_*hia 9

根据MSDN, 即使在应该存在的情况下也InvokeRequired可以返回- 即在您创建该控件/表单(或其父节点)之前访问的情况下.falseInvokeRequiredtrueInvokeRequiredHandle

基本上,您的支票不完整,这会导致您看到的结果.

您需要检查IsHandleCreated- 如果是false那样您将需要使用Invoke/ BeginInvoke无论InvokeRequired返回什么.

[UPDATE] 但是:这通常不会很有效地工作,因为Invoke/ BeginInvoke检查创建哪个线程Handle来做他们的魔法...... [/ UPDATE]

只有当IsHandleCreatedtrue你根据什么行动InvokeRequired返回-沿着线的东西:

if (control.IsHandleCreated)
{
    if (control.InvokeRequired)
    {
        control.BeginInvoke(action);
    }
    else
    {
        action.Invoke();
    }
}
else 
{ 
    // in this case InvokeRequired might lie - you need to make sure that this never happens! 
    throw new Exception ( "Somehow Handle has not yet been created on the UI thread!" );
}
Run Code Online (Sandbox Code Playgroud)

[UPDATE]

因此,以下内容对于避免此问题非常重要

始终确保Handle在第一次访问UI线程以外的线程之前已创建.

根据MSDN,您只需要control.Handle在UI线程中引用以强制它被创建 - 在您的代码中,这必须在您第一次从任何不是UI线程的线程访问该控件/表单之前发生.

[/ UPDATE]