2010-03-26 181 views
0

我已经创建了自己的WCF服务,并且我已经成功地通过我的Silverlight客户端与它交谈。尽管我在异步回调中遇到了一个有趣的问题。当调用我的回调,我不能可怕无效跨线程访问异步Silverlight WCF回调

这是我的回调函数是什么样子

private void GetTimeCallBack(object sender, Talk.ClientBase<IService>.ClientEventArgs e) 
    { 
     lblDisplay.Text = e.Object.ToString(); 
    } 

快速谷歌搜索给我看,我有更新任何UI控件代之以做到这一点。

private void GetTimeCallBack(object sender, Talk.ClientBase<IService>.ClientEventArgs e) 
    { 
     Dispatcher.BeginInvoke(() => lblDisplay.Text = e.Object.ToString()); 
    } 

现在一切正常,但我没想到我的回调是在不同的线程上运行。我是否总是必须使用Dispatcher类来修改我的类中的任何内容,还是仅限于UI元素?我完全不熟悉Dispatcher类,所以我期待更多地了解它。

回答

1

是的..结账link欲了解更多信息。我已经加入乔尔对问题的回复如下

在Silverlight 2 Beta 2中有一个在并发 模型用于异步 通信 显著变化。在Beta 1中,这些类型的 请求在UI线程上返回。 在Beta 2中,当您选择使用WebRequest的BeginGetResponse 时, 告诉Silverlight使用来自线程 池的 工作线程。因此,您无法更新 线程上的任何用户界面元素。使用Dispatcher.BeginInvoke 是一种获取方法的方法,可以从此线程池 thead上在UIThread上触发 。与异步回调 的 UI元素的任何交互都将引发交叉线程异常。

+0

很酷,谢谢。偶尔你会碰巧拥有更多关于这个话题的资源吗? – Matt