C#-BackgroundWorker不断更新控件: Error!

标签 c# backgroundworker multithreading invalidoperationexception

出于某种原因,我传统上在 C# 中使用 BackgroundWorkers 时遇到很多麻烦;他们的概念似乎确实难住了我,所以我希望这是一个相当基本的问题,并且可以很容易地纠正......

我有两个使用 .NET 远程处理来回通信的表单。现在,更改 Form1 上的设置会导致 Form2 上的某些内容发生变化,效果很好。但是,现在我需要以另一种方式使同样的事情工作(更改 Form2 上的某些内容会导致 Form1 更新),并且我不能以同样的方式执行此操作(由于设计的限制,我不能让 Form2 发送更改)到表格 1)。现在,我尝试在 Form1 上使用 BackgroundWorker 来不断调用每个子控件(放置在 Form1 上)上的“Update()”方法。这些控件中的每一个都可以从 Form2 中获取其等效设置的当前状态并更新自身(这很有效;“Update()”方法已被视为在 Form1 的初始化中起作用)。

这就是我的问题出现的地方。我不确定如何让BackgroundWorker在每个表单上不断调用“Update()”,因此在我的“DoWork()”方法中,我有一个“while(true)”循环,并且在其中BackgroundWorker调用“Update”每个子控件的 ()' 方法,然后休眠很短的时间,然后重复。

这样做时,我收到“InvalidOperationException 未由用户代码处理”错误,并详细说明“跨线程操作无效:控制‘comboBox_BGColor’是从创建它的线程以外的线程访问的。”现在,我基本上知道这意味着什么,也明白为什么会发生,但是,我不确定该做什么不同,或者如何改变事情以使其按预期工作。有人对此或我使用BackgroundWorker 的方式有任何提示吗?非常感谢您提供任何信息并花时间阅读本文!

最佳答案

UI 控件具有线程关联性。除了 UI 线程之外,您不应该从任何线程触摸控件(用于读取写入)。如果 BackgroundWorker 主要与 UI 对话,那么您可能最好只使用 Timer 控件,从而避免调用 多次调用BeginInvoke

但是,通常我更喜欢这里基于“观察者”的设计,带有更改通知事件(FooChangedINotifyPropertyChanged)以及导致 UI 反射(reflect)更改的事件处理程序。

关于C#-BackgroundWorker不断更新控件: Error!,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4215725/

相关文章:

c# - BackgroundWorker 仍然卡住 UI

c# - 如何处理来自 BackgroundWorker 线程的异常?

c# - 让多个线程轮询同一个串口的正确方法是什么?

c# - 如何在 .net DLL 中编辑 C# 代码

c# - 如何在 C#.net 中使用 Linq 表达式或 AsEnumerable 转换 Foreach 循环?

c# - VS2010/.NET 4.0 中 BackgroundWorker 线程访问的差异?

c++ - 将 std::mutex 用于由 boost::asio 管理的线程池

java - 在自定义线程类中执行可运行参数

c# - 如何使用 .net 检测 SSL 策略错误?

c# - 声明公共(public)类 A : B 是什么意思