【问题标题】:Error :System.InvalidOperationException: Cross-thread operation not valid错误:System.InvalidOperationException:跨线程操作无效
【发布时间】:2012-12-11 18:33:53
【问题描述】:

我收到异常“System.InvalidOperationException:跨线程操作无效”我怀疑控件上的数据填充来自另一个线程而不是 UI。有什么理由吗?我看到调用或开始调用可以做一些好的结果,如果是这样,我如何在我的代码中使用它?还是我们有任何其他替代机制。以下是我得到的跟踪

                Control control = null;
                object ancestor = Parent;

我可以在哪里使用 InvokeRequired,有什么想法吗?

【问题讨论】:

  • 作为一般规则,只有 UI 线程应该更新 UI。
  • 在执行 WhenUpdated() 时是否需要让 UI 响应其他用户请求?
  • @StingyJack 是的,那个时候 UI 应该是响应式的

标签: c# .net visual-studio-2010 exception


【解决方案1】:

通常您希望使用BackgroundWorker 以非阻塞方式更新 UI。

这允许您运行重复或长时间运行的后台操作,该操作可以向 UI 线程报告需要更新的详细信息。

BeginInvoke 是 .NET 1.1 实现相同目的的方式,但在很大程度上被后台工作程序所取代。

如果您使用的是 .net 4.5,您还可以使用 Async 选项。它们可能不是一个足够直接的替代品。

【讨论】:

  • 谢谢,但是我们是否有任何机制而不是后台工作人员来防止这个问题,我见过invokerequired 可以,但我不知道如何使用它?
  • 看看这个问题的答案中建议的其他一些替代方案。 stackoverflow.com/q/1132472/16391
【解决方案2】:

只需在表单加载事件中写入即可。

CheckForIllegalCrossThreadCalls =false;

在此之后您的代码可以正常运行......但请记住,跨线程应该是安全的......

【讨论】:

  • -1:请不要这样做。跨线程 UI 调用可能会导致各种奇怪的行为,因此请修复它以不进行跨线程调用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多