C# 我的调用者2有什么问题?
第一个话题是 我按照他向我推荐的答案去做,但我发现了一个新问题 下图的结果是交叉线程异常 我的代码有什么问题 如何解决这个问题 根据C# 我的调用者2有什么问题?,c#,.net,multithreading,invokerequired,C#,.net,Multithreading,Invokerequired,第一个话题是 我按照他向我推荐的答案去做,但我发现了一个新问题 下图的结果是交叉线程异常 我的代码有什么问题 如何解决这个问题 根据InvokeRequired可以返回false,即使InvokeRequired应该是true——即在创建该控件/窗体(或其父控件)的句柄之前访问InvokeRequired 基本上你的支票是不完整的,这导致了你看到的结果 您需要检查-如果这是false,那么您需要使用Invoke/BeginInvoke,而不管invokererequired返回什么 [更新] 但
InvokeRequired
可以返回false
,即使InvokeRequired
应该是true
——即在创建该控件/窗体(或其父控件)的句柄之前访问InvokeRequired
基本上你的支票是不完整的,这导致了你看到的结果
您需要检查-如果这是false
,那么您需要使用Invoke
/BeginInvoke
,而不管invokererequired
返回什么
[更新]
但是:
由于Invoke
/BeginInvoke
检查哪个线程创建了Handle
来执行它们的魔法,因此这通常不会很有效。。。
[/更新]
只有当IsHandleCreated
为true
时,您才能根据invokererequired
返回的内容进行操作-大致如下:
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!" );
}
[更新]
因此,以下内容对于避免此问题非常重要
始终确保在对UI线程以外的线程进行首次访问之前,已经创建了句柄
根据需要,您只需在UI线程中引用control.Handle
,即可强制创建它-在您的代码中,这必须在您第一次从非UI线程的任何线程访问该控件/表单之前发生
[/UPDATE]IsHandleCreated为false,调用开始后,它捕获异常。“在创建窗口句柄之前,无法对控件调用Invoke或BeginInvoke。”已解决!!我的UI线程未创建。我只是在调用这个函数之前做了一些延迟,它就工作了!