Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.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# WPF rapid CollectionChanged事件阻塞UI。何处及;如何实现CustomControl的延迟更新_C#_.net_Wpf - Fatal编程技术网

C# WPF rapid CollectionChanged事件阻塞UI。何处及;如何实现CustomControl的延迟更新

C# WPF rapid CollectionChanged事件阻塞UI。何处及;如何实现CustomControl的延迟更新,c#,.net,wpf,C#,.net,Wpf,我创建了一个有点复杂的CustomControl,虽然经过了优化和线程化,但在绑定集合更改后更新UI仍然需要相当长的时间 我将此控件绑定到DataGrid的SelectedItems集合 SelectedItems集合本身会为集合中的每个项目触发CollectionChanged事件 因此,例如,用户拖动鼠标选择10个项目,这会导致连续快速触发10个CollectionChanged事件 这反过来会导致控件连续更新10次,从而导致UI阻塞 要明确的是,我的控件在后台线程中完成所有处理,并且经过优

我创建了一个有点复杂的CustomControl,虽然经过了优化和线程化,但在绑定集合更改后更新UI仍然需要相当长的时间

我将此控件绑定到DataGrid的SelectedItems集合

SelectedItems集合本身会为集合中的每个项目触发CollectionChanged事件

因此,例如,用户拖动鼠标选择10个项目,这会导致连续快速触发10个CollectionChanged事件

这反过来会导致控件连续更新10次,从而导致UI阻塞

要明确的是,我的控件在后台线程中完成所有处理,并且经过优化以在UI线程上完成最少的工作

“延迟”控件更新的正确方法(或某些选项)是什么,以便快速收集更改的事件(甚至数据绑定更改)导致更新次数最少


谢谢你的建议

绑定异步可能会有所帮助。这样,UI的其余部分将首先处理

    Text="{Binding Path=MyGabeLib.Search.SelectedDoc.DocTextDownloadFirstPage,
           IsAsync=True, FallbackValue=Waiting_For_Server, Mode=OneWay}" /> 

此外,对于昂贵的计算,我通常会保存输入和结果,如果输入没有更改,我会返回先前的结果,因为UI有时会多次调用get。

绑定异步可能会有所帮助。这样,UI的其余部分将首先处理

    Text="{Binding Path=MyGabeLib.Search.SelectedDoc.DocTextDownloadFirstPage,
           IsAsync=True, FallbackValue=Waiting_For_Server, Mode=OneWay}" /> 

此外,对于昂贵的计算,我通常会保存输入和结果,如果输入没有更改,我会返回先前的结果,因为UI有时会多次调用get。

如果您正在处理
数据网格的
SelectedItems
事件的
CollectionChanged
,则没有转义可悲的是(

尽管可以做一件事,但不要通过订阅
数据网格
CollectionChanged
事件直接更新自定义控件,请使用基于
Dispatchermer
的中间发布者-订阅者队列对。计时器将每500毫秒发布一次其条目(对于机器来说是慢的,但对于用户来说似乎是快的)然后每隔500毫秒发布一个事件,所有集合更改的事件都集中在这500毫秒内(所有e.NewItems和e.OldItems都集中在一起)


发布者计时器只有在找到至少一个尚未发布的已更改收藏条目时才会开始计时。

如果您正在处理
DataGrid
SelectedItems
事件的
CollectionChanged
,则无法逃脱:(

尽管可以做一件事,但不要通过订阅
数据网格
CollectionChanged
事件直接更新自定义控件,请使用基于
Dispatchermer
的中间发布者-订阅者队列对。计时器将每500毫秒发布一次其条目(对于机器来说是慢的,但对于用户来说似乎是快的)然后每隔500毫秒发布一个事件,所有集合更改的事件都集中在这500毫秒内(所有e.NewItems和e.OldItems都集中在一起)


发布者计时器只有在发现至少一个已更改的收藏条目尚未发布时才会开始计时。

您如何启动后台进程?能否显示代码?可能的方法?不要直接依赖DataGrid获取SelectedItems。在DataGrid中提供复选框列并管理收藏直接。我知道这是不可靠的-这只是一个想法。@Rachel我正在使用
任务
运行后台进程(尽管这相当快)。实际的慢度来自于对分组项控件的呈现。但是,我对控件本身的相对呈现速度“没问题”,这个问题只源于多次快速调用。感谢@BalamBalam,我考虑过这一点,但是DataGrid的内容也是数据绑定的,可以是任何类型。您如何开始b后台处理?你能展示你的代码吗?一种可能的方法?不要直接依赖DataGrid来获取SelectedItems。在DataGrid中提供一个复选框列并直接管理集合。我知道这是不可靠的-这只是一个想法。@Rachel我正在使用一个
任务
来运行后台处理(尽管这相当快)。实际的慢度来自于对分组项控件的呈现。但是,我对控件本身的相对呈现速度“没问题”,这个问题只源于多次快速调用。感谢@BalamBalam,我正在考虑这个问题,但是DataGrid的内容也是数据绑定的,可以是任何类型。我感谢您的回复,但我t不是需要较长时间才能获取数据,而是UI呈现本身……我认为它也会延迟控件内容的呈现。请理解,它并不能满足您的需要,因为缓慢呈现就是缓慢呈现,最后一次呈现并不能真正帮助您。我感谢您的回复,但不是获取数据需要较长时间ime,但UI呈现本身…我认为它也会延迟控件内容的呈现。请理解,它并不能满足您的需要,因为慢呈现就是慢呈现,最后一次呈现并不能真正帮助您。感谢您的回复。这是我已经实现的解决方案,但感觉有点不干净…谢谢您的回复.这是我已经实施的解决方案,但感觉有点不干净。。。