Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.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# 后台工作人员正在更新UI线程中的模型,没有问题_C#_.net_Wpf_Multithreading_Backgroundworker - Fatal编程技术网

C# 后台工作人员正在更新UI线程中的模型,没有问题

C# 后台工作人员正在更新UI线程中的模型,没有问题,c#,.net,wpf,multithreading,backgroundworker,C#,.net,Wpf,Multithreading,Backgroundworker,我使用的是BackgroundWorker,我实现了ProgressChanged方法,该方法允许我将e.UserState传递到我的UI,它可以正常工作 作为一个实验,我改变了我的DoWork方法,在绑定到UI ListView的同一个模型上工作(这是一个可观察的集合) 当我这样做的时候,UI会更新&我想知道为什么它在多次测试后都能做到完美无瑕 我将继续使用e.UserState对象,但我想知道这是否是正常行为&潜在的问题是什么?您当然可以从后台线程更改模型的属性,而不会遇到任何问题;绑定引擎

我使用的是BackgroundWorker,我实现了ProgressChanged方法,该方法允许我将e.UserState传递到我的UI,它可以正常工作

作为一个实验,我改变了我的DoWork方法,在绑定到UI ListView的同一个模型上工作(这是一个可观察的集合)

当我这样做的时候,UI会更新&我想知道为什么它在多次测试后都能做到完美无瑕


我将继续使用e.UserState对象,但我想知道这是否是正常行为&潜在的问题是什么?

您当然可以从后台线程更改模型的属性,而不会遇到任何问题;绑定引擎将确定需要对UI元素进行哪些更改,并在调度程序线程“”上调用这些更改。这是正常的,不会导致问题

您不能(也永远不能)直接从同一后台线程更改UI元素的属性



这一直是可能的,事实上,这是不可能的。考虑某些代码(例如模型)需要更改另一模型的属性。这段代码肯定无法知道属性已绑定到任何控件,更不用说是哪个控件了。因此,每次将属性更改封送到相应的UI线程不仅不方便,而且非常困难。

首先:您使用什么作为GUI框架?我记得,例如,WinForms在被非ui线程调用时异常宽容,其他框架检查代码以使用Invoke*而不是直接调用。我假设ObservableCollection直接绑定到您的视图?嘿,对不起,我忘记了WPF标记,将立即添加WPF自动封送对UI线程的属性更改。另请参见此问题:。只要您只是更改模型中的属性,WPF将使用正确的Dispatcher自动反映UI中的更改他使用的是
ObservableCollection
,即使他正在编辑集合中的项目,UI是否也会更改?我不认为INotifyCollectionChanged.CollectionChanged会在集合未添加/删除项时触发。Wow数据绑定确实有它的优点。我现在明白了,模型更新来自线程OK,UI更新来自线程-使用ProgressChanged。Thankyou@TinoMclaren当前位置尽管如此,这里还是有一些问题--您到底在做哪些更改?示例代码?@Jon我现在无法发布代码,但它的属性如ProgressBar.Value在视图中。只要阅读封送处理,我需要注意什么?@TinoMclaren:像这样的东西(直接改变值)总是可以工作的,绑定引擎做它必须做的事情。但是,对于
observateCollection.Add(stuff)
(不是属性访问,这是事情不同的强烈暗示)这样的事情,您不能做同样的事情。