C# WPF高频事件和更新UI

C# WPF高频事件和更新UI,c#,wpf,multithreading,C#,Wpf,Multithreading,我有一个连接到USB设备的WPF应用程序。该设备以大约10/秒的速率引发事件。来自这些事件的数据将更新条形图和折线图。条形图表示每个事件发生时的数据。折线图用于显示随时间变化的值,并从测量开始时的历史值集合中读取 我的问题是,在大约3-5分钟的测量之后,UI变得非常慢,最终没有响应。我认为这是因为下面的代码片段太频繁了,最终锁定了UI线程 System.Windows.Application.Current.Dispatcher.BeginInvoke(new Action(() =>

我有一个连接到USB设备的WPF应用程序。该设备以大约10/秒的速率引发事件。来自这些事件的数据将更新条形图和折线图。条形图表示每个事件发生时的数据。折线图用于显示随时间变化的值,并从测量开始时的历史值集合中读取

我的问题是,在大约3-5分钟的测量之后,UI变得非常慢,最终没有响应。我认为这是因为下面的代码片段太频繁了,最终锁定了UI线程

System.Windows.Application.Current.Dispatcher.BeginInvoke(new Action(() => 
{ 
    Update the collection here.
}));

是否有更好的方法来更新集合,以免锁定UI?

您肯定已经解决了问题。但是,这不是内存泄漏。
最有可能的是,BeginInvoke将更多的“更新收集”任务排在队列中,而不是调度器可以完成的任务。在某个时刻,调度器必须处理数千个任务,同时每秒启动10个新任务。
要解决此问题,您需要确保调度器没有被新任务淹没。您可以从单独的线程仅使用最新数据更新UI。

如果代码在短时间内运行良好,然后在一段时间后锁定。。。你的问题是你很可能有内存泄漏,因为延迟直到应用程序运行一段时间后才会启动。如果您查看任务管理器,内存可能会随着时间的推移而增加,直到接近最大值,您开始经历延迟和冻结。确保正在进行的集合更新已被处理,并且未存储在没有任何作用的变量上。内存似乎不是问题(仅达到90mb左右)。GC看起来很忙。你所说的“存储在一个没有任何作用的变量上”是什么意思?你可以从一个单独的线程更新UI?你的答案大部分是正确的,但这句话暗示UI没有线程关联,可以由任何线程直接更新,这是错误的。只有一个线程(UI线程)可以更新UI。