Ato*_*Hic 3 .net c# multithreading invokerequired
第一个主题是我的InvokeRequied有什么问题
我按照他向我推荐的答案,但我发现了一个新问题.
下图的结果是跨线程异常.
我的代码出了什么问题?
如何解决这个问题呢 ?

根据MSDN, 即使在应该存在的情况下也InvokeRequired可以返回- 即在您创建该控件/表单(或其父节点)之前访问的情况下.falseInvokeRequiredtrueInvokeRequiredHandle
基本上,您的支票不完整,这会导致您看到的结果.
您需要检查IsHandleCreated- 如果是false那样您将需要使用Invoke/ BeginInvoke无论InvokeRequired返回什么.
[UPDATE]
但是:这通常不会很有效地工作,因为Invoke/ BeginInvoke检查创建哪个线程Handle来做他们的魔法...... [/ UPDATE]
只有当IsHandleCreated是true你根据什么行动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]