2012-03-27 41 views
2

我知道如何通过Invoke/BeginInvoke从工作线程传递数据到主线程。 我也可以通过主线程中的定时器从线程安全集合中提取数据。 我更喜欢使用任务(Task.Factory.StartNewTask())并且使用Backgroundworker接缝有点笨拙。从另一个线程传递数据时,是否有替代方法可以在WPF中调用?

有时GUI是有点laggy这是由于(开始)调用我承担。 用计时器拉也不觉得正确的方式。 为每个新任务创建一个新的Backgroundworker接缝也很奇怪。

还有其他的可能吗?

回答

3

在.NET中,存储器被一个AppDomain,这意味着所有线程可以访问所有数据内共享。所以,你实际上在做什么是控制对特定线程的特定位数据的访问,所以它们不会相互干扰。

调用和BeginInvoke来让你的UI线程,因为UI控件只能从UI线程访问,这是有用上运行代码。 BackgroundWorker是SynchronizationContext的另一种解决方案。

然而,他们通过发送已知的Windows消息的UI消息循环的所有工作。如果您经常调用Invoke,则会发送太多消息,并且UI线程被淹没,从而导致UI“有点迟缓”。

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

1)调用次数较少:这意味着在调用Invoke更新UI之前,在后台线程中等待更大的状态更改“块”。

2)使用UI计时器:有在试图比人眼可以检测更快地更新UI没有意义的。一个UI定时器也发送窗口消息到UI消息循环,但以已知的速率。 Tick处理程序可以从共享内存中提取必要的数据来更新UI。

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

相关问题