【发布时间】:2011-07-05 13:20:50
【问题描述】:
我一直在 Silverlight 中开发 Lync Silverlight 应用程序,现在我正在尝试将其转移到 WPF。
但是,我面临一些线程关联性问题。例如,我在我的页面上的文本块中显示 Lync 客户端的状态,因此在我后面的代码中连接了一个状态更改事件处理程序,每当 Lync 客户端的状态发生更改时,它都会将新状态写入文本块。
现在,这在 Silverlight 中完美运行,但在 WPF 中似乎是不允许的。 现在我的问题是:
即使 Silverlight 应该是 WPF 的子集,为什么它在 Silverlight 中而不是在 WPF 中工作?
线程亲和性是一个重要的概念,我知道我们可以使用调用调度程序,但它不是以事件处理程序和回调的形式超越了异步编程的概念吗?
-
我在我的 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