Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我的调用者2有什么问题?_C#_.net_Multithreading_Invokerequired - Fatal编程技术网

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线程未创建。我只是在调用这个函数之前做了一些延迟,它就工作了!