【问题标题】:Difference in Event Handling in Silverlight and WPF - Thread Affinity issuesSilverlight 和 WPF 中事件处理的差异 - 线程关联性问题
【发布时间】:2011-07-05 13:20:50
【问题描述】:

我一直在 Silverlight 中开发 Lync Silverlight 应用程序,现在我正在尝试将其转移到 WPF。

但是,我面临一些线程关联性问题。例如,我在我的页面上的文本块中显示 Lync 客户端的状态,因此在我后面的代码中连接了一个状态更改事件处理程序,每当 Lync 客户端的状态发生更改时,它都会将新状态写入文本块。

现在,这在 Silverlight 中完美运行,但在 WPF 中似乎是不允许的。 现在我的问题是:

  1. 即使 Silverlight 应该是 WPF 的子集,为什么它在 Silverlight 中而不是在 WPF 中工作?

  2. 线程亲和性是一个重要的概念,我知道我们可以使用调用调度程序,但它不是以事件处理程序和回调的形式超越了异步编程的概念吗?

  3. 我在我的 XAML 页面中定义了一个按钮,并且在其上定义的单击事件处理程序可以访问其他 UI 元素,它不会遇到上述问题。

    但是,如果我在代码隐藏中定义 LyncClient 实例,则在其上定义的事件处理程序无法访问 UI 元素。为什么会这样,我在 Silverlight 中没有检测到 UIElement 和其他对象之间存在这种差异?

【问题讨论】:

  • 您能否阐明在 SL 和 WPF 中是什么对象/api 向您的应用程序发起了事件?听起来 SL 中的那个几乎是在 UI 线程上引发事件,而 WPF 中的那个是在后台线程上引发它。
  • 嗨,内森,感谢您的关注。我的页面上有一个按钮,在该按钮上定义了一个单击事件,并且在后面的代码中,我使用 LyncClient.GetClient() 来获取一个 LyncCLient 对象,我为该对象定义了状态更改事件的事件处理程序。现在,在 silverlight 中,我能够在两个事件处理程序中更改 UI 元素。但在 WPF 中,我只能在 click 事件处理程序中更改 UI。如果我尝试在 LyncClient State Changed 事件处理程序中访问 UI 对象,我会收到错误 - 线程访问无效。
  • LyncClient 是您编写的,还是 Microsoft 或其他第三方提供的 API 的一部分?我想知道他们在 Silverlight 版本和 WPF 版本之间的实现方式是否不同。
  • 它只是 MS 的一个 API...我已经阅读了很多关于 SL 的 MS 文档,但没有找到任何关于线程关联概念的参考(在我看到的所有示例中,它们无缝地使用了回调和事件处理程序)...我认为由于 Silverlight 应用程序旨在在浏览器中运行,因此它们与旨在在操作系统上运行的 wpf 应用程序具有相同的线程模型...所以我所说的可能是 silverlight应用程序不必遵守线程亲和性限制......不过我警告你 - 这只是我自己的推论,我还没有在任何地方发现任何这样的东西:P
  • 至于为什么,定义在 UI 元素(如按钮)上的事件处理程序可以访问 UI 元素和对象上定义的对象上的事件处理程序,这些对象是在 cant 后面的代码中定义的......我认为 ui 对象的事件处理程序将在 ui 中运行仅限线程,对于在代码隐藏中定义的对象,它们将在后台线程上运行..

标签: wpf multithreading event-handling dispatcher affinity


【解决方案1】:

基于上述cmets,我会建议以下“答案”...

我猜想,SL API 的编写方式与 WPF api 的编写方式很可能有所不同。这可以解释 API 发出回调时使用的线程的差异。要验证这一点,您可以:

  1. 直接问MS
  2. 在您的回调方法中添加一些诊断代码以记录线程 ID 并将其与应用程序的主线程进行比较。对 SL 和 WPF 执行此操作,以查看它们是相同的还是不同的线程。
  3. 在 Reflector 中打开程序集以检查每个 API 的编写方式。

就处理这种特定情况而言,在您的回调中,您可以:

  1. 获取调度程序对象(SL 与 WPF 不同)并始终通过 Dispatcher.Invoke 发布 UI 更新。
  2. 使用数据绑定和 INotifyPropertyChanged 将 UI 与属性隔离。您可以在 ViewModel 或后面的代码中删除属性。然后将 UI 的文本框绑定到该属性。数据绑定有一些智能,可以自动将属性更改编组到正确的线程(在大多数情况下无论如何)。

希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多