出于某种原因,我传统上在 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
。
但是,通常我更喜欢这里基于“观察者”的设计,带有更改通知事件(FooChanged
或INotifyPropertyChanged
)以及导致 UI 反射(reflect)更改的事件处理程序。
关于C#-BackgroundWorker不断更新控件: Error!,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4215725/