c# - 我的 InvokeRequied #2 有什么问题?

标签 c# .net multithreading invokerequired

第一个话题是What wrong with my InvokeRequied

我按照他推荐给我的答案做了,但是我发现了一个新问题。

下图结果是跨线程异常。

我的代码有什么问题?

如何解决这个问题?

enter image description here

最佳答案

根据 MSDN即使在 InvokeRequired 应该是 true 的情况下,InvokeRequired 也可以返回 false - 即在您访问 的情况下>InvokeRequired 在创建该控件/窗体(或其父级)的 Handle 之前。

基本上您的检查不完整导致您看到的结果。

你需要检查IsHandleCreated - 如果为 false,则无论 InvokeRequired 返回什么,您都需要使用 Invoke/BeginInvoke

[更新] 但是: 这通常不会很好地工作,因为 Invoke/BeginInvoke 检查哪个线程创建了 Handle 来发挥他们的魔力...... [/更新]

只有当 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!" );
}

[更新]

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

始终确保在 UI 线程以外的线程上首次访问之前已经创建了 Handle

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

[/更新]

关于c# - 我的 InvokeRequied #2 有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8946590/

相关文章:

c# - 如何使用 C# 使用 Contains

c# - Visual Studio "Add Service Reference"不断将 "extendedProtectionPolicy"添加到我的配置文件

java - 在多线程应用程序 Android 中访问数据库的最佳方式?

python - python中创建线程重写另一个结构体

c# - 我如何防止使用 C# 进行屏幕录制

c# - 链表与列表<T>

java - Java 和 .NET 之间的桥梁

c# - 为什么异常过滤器比捕获和重新抛出更可取?

python - 将 asyncio 与多处理结合起来会出现什么样的问题(如果有的话)?

c# - List.ForEach 在技术上是 LINQ 的一部分吗?