C# 当从不同的线程传递数据时,WPF中是否有其他调用方法?

C# 当从不同的线程传递数据时,WPF中是否有其他调用方法?,c#,wpf,backgroundworker,task,invoke,C#,Wpf,Backgroundworker,Task,Invoke,我知道如何通过Invoke/BeginInvoke将数据从工作线程传递到主线程。 我还可以从一个线程安全的集合中使用一个来自主线程的计时器进行提取。 我更喜欢使用任务(Task.Factory.StartNewTask()),而使用Backgroundworker处理它们则有点笨拙 有时gui有点滞后,这是由于我假设的(Begin)调用造成的。 用计时器拉车也感觉不太对劲。 为每个新任务创建一个新的Backgroundworker也很奇怪 还有其他可能性吗?在.NET中,内存在AppDomain

我知道如何通过Invoke/BeginInvoke将数据从工作线程传递到主线程。 我还可以从一个线程安全的集合中使用一个来自主线程的计时器进行提取。 我更喜欢使用任务(Task.Factory.StartNewTask()),而使用Backgroundworker处理它们则有点笨拙

有时gui有点滞后,这是由于我假设的(Begin)调用造成的。 用计时器拉车也感觉不太对劲。 为每个新任务创建一个新的Backgroundworker也很奇怪


还有其他可能性吗?

在.NET中,内存在AppDomain中共享,这意味着所有线程都可以访问所有数据。所以,实际上您所做的是控制对来自特定线程的特定数据位的访问,这样它们就不会相互干扰

Invoke和BeginInvoke允许您在UI线程上运行代码,这非常有用,因为只能从UI线程访问UI控件。BackgroundWorker是另一个解决方案,SynchronizationContext也是

但是,它们都通过向UI消息循环发送已知的windows消息来工作。如果调用Invoke太频繁,则会发送太多消息,UI线程被淹没,从而使UI“有点滞后”

如果发生这种情况,则必须降低消息的发送速率。有几种方法可以做到这一点:

1) 调用调用频率较低:这意味着在后台线程调用调用以更新UI之前,要等待更大的“块”状态更改

2) 使用UI定时器:尝试更新UI的速度超过人眼的检测速度是没有意义的。UI计时器还以已知的速率向UI消息循环发送windows消息。然后,勾号处理程序可以从共享内存中提取必要的数据来更新UI

这两种方法各有优缺点。这种选择实际上取决于将后台线程中的状态更改分组为更大的块的容易程度,同时确保UI不会错过任何状态更改