分派器和工作线程



我有一个关于Dispatchers和后台worker线程的问题。我有一个异步处理HTTP请求的系统。最终,ObservableCollection被绑定到WPF控件。

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

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

转移到跨线程的可观察对象集合不是一个选项。另一个问题是,我需要维护对UI线程调度程序的引用。是否有任何方法可以使用Dispatcher类/线程命名空间中的其他类来确定我是否在UI线程中?或者我应该继续使用调度线程的调度程序来运行处理程序,而不管调度线程是否是UI线程?

谢谢!

我一直在使用Dispatcher。CurrentDispatcher

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

你可以尝试使用Application.Current.Dispatcher,我的观察表明,这是与主UI线程相关联的调度程序,虽然我不能肯定地说,如果这是总是的情况。你还需要记住,如果你有多个UI线程,这可能不起作用,你不知道哪个线程拥有绑定到ObservableCollection的UI元素。在这种情况下,您需要开始传递对适当Dispatcher(或SynchronizationContext)的引用。

相关内容

  • 没有找到相关文章

最新更新