调度程序和工作线程

时间:2011-04-12 23:02:32

标签: wpf observablecollection dispatcher

我对Dispatchers和后台工作线程有疑问。我有一个系统,其中我异步处理HTTP请求。最终,ObservableCollection绑定到WPF控件。

我一直在使用Dispatcher.CurrentDispatcher.CheckAccess()代替Silverlight的Deployment.Current.Dispatcher.CheckAccess()来确定我是否在UI线程中。但是,看看Stack Overflow上的文档和其他问题,似乎WPF版本只是在需要时创建一个调度程序。

当前系统在调度线程上使用CheckAccess来确定我们是否在UI线程上,然后将其传递给在工作线程中运行的处理程序。工作线程上的CheckAccess也返回true,大概是因为它刚刚创建了自己的Dispatcher。

移动到跨线程可观察集合不是一种选择。另一个问题是我需要维护对UI线程调度程序的引用。有没有办法在Threading命名空间中使用Dispatcher类/其他类来确定我是否在UI线程中?或者我应该继续使用调度线程的调度程序来运行处理程序,无论调度线程是否是UI线程?

谢谢!

1 个答案:

答案 0 :(得分:2)

  

我一直在使用Dispatcher.CurrentDispatcher

这将简单地获取与调用(当前)线程关联的Dispatcher,如果不存在,则将创建它。正如您所发现的那样,在该调度程序上调用 CheckAccess()将返回 true

您可以尝试使用Application.Current.Dispatcher,我的观察显示这是与主UI线程相关联的调度程序,但我无法确定这是总是的情况。您还需要记住,如果您有多个UI线程,这可能不起作用,您将不知道哪个线程拥有绑定到ObservableCollection的UI元素。在这种情况下,您需要开始将引用传递给相应的Dispatcher(或SynchronizationContext)。