.net System.Threading.Timer需要在回调中访问Silverlight 3 UI组件

时间:2010-01-12 19:59:11

标签: .net silverlight multithreading

我有一个Silverlight 3页面。我使用System.Threading.Timer来执行异步WCF服务调用。我通过将Silverlight页面类(“this”)作为timer构造函数中的“state”对象传入,并通过它访问服务客户端代理来进行调用。通过这种方式,WCF服务的回调可以解决。

我的问题(据我所知)是WCF调用的返回发生在一个单独的线程中,因此当我尝试访问/修改Silverlight页面上的UI元素时出现访问错误。

首先,我对这个问题的理解是否正确?

第二,解决这个问题最具建设性的方法是什么?

感谢您的帮助。

2 个答案:

答案 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 });

更多信息:http://msdn.microsoft.com/en-us/library/ms591206.aspx