我对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线程?
谢谢!
答案 0 :(得分:2)
我一直在使用Dispatcher.CurrentDispatcher
这将简单地获取与调用(当前)线程关联的Dispatcher,如果不存在,则将创建它。正如您所发现的那样,在该调度程序上调用 CheckAccess()将返回 true 。
您可以尝试使用Application.Current.Dispatcher
,我的观察显示这是与主UI线程相关联的调度程序,但我无法确定这是总是的情况。您还需要记住,如果您有多个UI线程,这可能不起作用,您将不知道哪个线程拥有绑定到ObservableCollection的UI元素。在这种情况下,您需要开始将引用传递给相应的Dispatcher(或SynchronizationContext)。