0

我已经创建了自己的 WCF 服务,并且已经成功地通过我的 Silverlight 客户端与其交谈。不过,我在异步回调中遇到了一个有趣的问题。当我的回调被调用时,我无法使用可怕的无效跨线程访问更新任何 UI 控件

这是我的回调函数的样子

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

一个快速的谷歌搜索告诉我我必须这样做。

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

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

4

1 回答 1

1

是的..查看链接以获取更多信息。我已经添加了乔尔对以下问题的答复

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

于 2010-03-26T06:06:38.283 回答