0

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

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

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

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

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

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

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

4

1 回答 1

0

根据上述评论,我将建议以下“答案”......

我猜想,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 的文本框绑定到该属性。数据绑定有一些智能,可以自动将属性更改编组到正确的线程(在大多数情况下无论如何)。

希望有帮助。

于 2011-07-08T19:55:06.820 回答