我有一个Silverlight 3页面。我使用System.Threading.Timer来执行异步WCF服务调用。我通过将Silverlight页面类(“this”)作为timer构造函数中的“state”对象传入,并通过它访问服务客户端代理来进行调用。通过这种方式,WCF服务的回调可以解决。
我的问题(据我所知)是WCF调用的返回发生在一个单独的线程中,因此当我尝试访问/修改Silverlight页面上的UI元素时出现访问错误。
首先,我对这个问题的理解是否正确?
第二,解决这个问题最具建设性的方法是什么?
感谢您的帮助。
答案 0 :(得分:2)
使用this.Dispatcher.BeginInvoke
是必要的,可以在有权访问UI元素的线程上移动代码。然而,一些想法可能值得申请。简单地执行此操作可能很容易: -
this.Dispatcher.BeginInvoke(() => {
// The whole body of code needed
});
然而,有几件事需要考虑。如果整个代码代码要做任何不涉及访问UI元素的重要工作,那么首先执行此操作可能会更好,然后只有当您将所有内容放在一起修改UI时才切换到UI线程。这可能意味着改变事情发生的顺序,甚至可能使用一些变量来保留值直到以后。
其次,如果从UI线程本身经常使用相同的回调,那么重新排列代码代码可能会更好,这些回调直接运行代码而不使用seondary函数调用或BeginInvoke。 Dispatchers CheckAccess
方法可以帮助您确定是否需要BeginInvoke。但是在您的特定场景中,总是需要BeginInvoke。
答案 1 :(得分:1)
找到答案:我需要将回调代码包装在:
中this.Dispatcher.BeginInvoke(() => { code here });