【问题标题】:Dispatcher and Worker Threads调度程序和工作线程
【发布时间】:2011-04-12 23:02:31
【问题描述】:

我有一个关于调度程序和后台工作线程的问题。我有一个系统,我在其中异步处理 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 线程?

谢谢!

【问题讨论】:

    标签: wpf observablecollection dispatcher


    【解决方案1】:

    我一直在使用 Dispatcher.CurrentDispatcher

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

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

    【讨论】:

    • 我正在尝试使用它,但由于某种原因,在我的项目中找不到 Application 类。我添加了对 PresentationFramework 的引用,但编译器仍然告诉我“应用程序”在命名空间“System.Windows”中不可用。我需要参考另一个程序集吗?我正在使用 C# 类库。
    猜你喜欢
    • 2013-09-16
    • 1970-01-01
    • 2016-11-01
    • 2021-11-11
    • 2015-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多