Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C-BackgroundWorker不断更新控件:错误!_C#_Backgroundworker_Multithreading_Invalidoperationexception - Fatal编程技术网

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

C# C-BackgroundWorker不断更新控件:错误!,c#,backgroundworker,multithreading,invalidoperationexception,C#,Backgroundworker,Multithreading,Invalidoperationexception,由于某些原因,我传统上在C语言中与后台工作人员有很多麻烦;他们的概念似乎真的让我很困惑,所以我希望这是一个相当基本的问题,并且可以很容易地纠正 我有两种使用.NET远程处理进行来回通信的表单。现在,更改Form1上的设置会导致Form2上的某些更改,这非常有效。然而,现在我需要以另一种方式来做同样的事情,在Form2上更改某些内容会导致Form1更新,我不能以同样的方式来做。由于设计的限制,我不能让Form2将更改发送到Form1。现在,我正在尝试使用Form1上的BackgroundWorke

由于某些原因,我传统上在C语言中与后台工作人员有很多麻烦;他们的概念似乎真的让我很困惑,所以我希望这是一个相当基本的问题,并且可以很容易地纠正

我有两种使用.NET远程处理进行来回通信的表单。现在,更改Form1上的设置会导致Form2上的某些更改,这非常有效。然而,现在我需要以另一种方式来做同样的事情,在Form2上更改某些内容会导致Form1更新,我不能以同样的方式来做。由于设计的限制,我不能让Form2将更改发送到Form1。现在,我正在尝试使用Form1上的BackgroundWorker对放置在Form1上的每个子角色不断调用“Update”方法。这些控件中的每一个都有办法从Form2中获取其等价设置的当前状态,并自我更新,这样效果很好;“Update”方法已被视为正在对Form1进行初始化

这就是我的问题所在。我不确定如何让BackgroundWorker在每个表单上不断调用“Update”,因此在我的“DoWork”方法中,我有一个whiletrue循环,其中BackgroundWorker调用每个子控件的“Update”方法,然后睡眠很短时间,然后重复

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

UI控件具有线程关联性。除了UI线程之外,您不应该触摸任何线程的读写控件。如果BackgroundWorker主要与UI对话,那么最好只使用一个计时器控件,避免多次调用Invoke或BeginInvoke


但是,一般来说,我更喜欢基于观察者的设计,使用更改通知事件FooChanged或INotifyPropertyChanged,以及导致UI反映更改的事件处理程序。

您需要计时器控制,而不是后台工作程序。

您收到的异常将是调用Update的结果,Update直接从DoWork修改主线程中的一个或多个表单在后台工作人员的线程中

如果要使用BackgroundWorker方法:

将worker的.WorkerReportsProgress属性设置为true 执行循环时,使用worker的.ReportProgress方法触发worker的_ProgressChanged事件处理程序。 然后_ProgressChanged事件处理程序可以安全地执行对表单更新方法的调用 如果您不再使用worker,特别是如果您的后台worker仅用于此循环,那么我建议您使用标准事件处理程序。该路由将产生更少的处理器开销,无论它目前可能是或可能不是最小的,都比添加外部循环或计时器控件要少

任何一个路由都应该处理跨线程异常