2

出于某种原因,我传统上在 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 的方式有任何提示吗?非常感谢您提供任何信息并花时间阅读本文!

4

3 回答 3

3

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

但是,通常我更喜欢这里基于“观察者”的设计,其中包含更改通知事件(FooChangedINotifyPropertyChanged)和导致 UI 反映更改的事件处理程序。

于 2010-11-18T14:24:24.287 回答
1

您需要计时器控制而不是后台工作人员

于 2010-11-18T14:25:05.993 回答
1

您收到的异常将是直接从BackgroundWorker 的线程中调用Update()(修改主线程中的一个或多个表单)的结果。_DoWork

如果您要使用该BackgroundWorker方法:

  • 将您的工人的.WorkerReportsProgress财产设置为true
  • 执行循环时,使用 worker 的.ReportProgress()方法来触发 worker 的_ProgressChanged事件处理程序。
  • 然后_ProgressChanged事件处理程序可以安全地执行对表单Update()方法的调用

如果您不再使用工作程序(特别是如果您的后台工作程序仅存在于此循环中),那么我建议您使用Marc对标准事件处理程序的建议。Timer与添加外部循环或控件相比,该路由将产生更少的处理器开销(无论当前可能是也可能不是) 。

任一路由都应解决跨线程异常。

于 2010-11-18T16:45:36.403 回答