异步 Silverlight WCF 回调

发布于 2024-08-26 19:54:00 字数 707 浏览 8 评论 0原文

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

这是我的回调函数的样子。

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

快速的 google 搜索告诉我,我必须这样做。

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

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

I've created my own WCF service and I've successfully been able to talk to it via my Silverlight client. I ran into an interesting problem on my asynchronous callbacks though. When my callback is invoked, I can't update any UI controls with the dreaded invalid cross thread access

Here's what my callback function looks like

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

A quick google search showed me that I have to do this instead.

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

Now everything works fine, but I wasn't expecting my callback to be running on a different thread. Will I always have to use the Dispatcher class in order to modify anything within my class or is this just limited to UI elements? I've not familiar with the Dispatcher class at all so I'm looking to understand it more.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

千里故人稀 2024-09-02 19:54:00

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

在 Silverlight 2 Beta 2 中,有一个
并发量发生显着变化
用于异步的模型
通讯。在 Beta 1 中这些类型
UI 线程上返回的请求数。
在 Beta 2 中,当您选择使用
您的 WebRequest 的 BeginGetResponse
告诉 Silverlight 使用
来自线程的工作线程
水池。结果,您无法更新
UI 上的任何用户界面元素
线。使用 Dispatcher.BeginInvoke
是一种获得反击方法的方法
在此线程池的 UIThread 上
头。与任何互动
来自异步回调的 UIelements
会抛出跨线程异常。

yes.. Checkout the link for more info. I have added Joel's reply to the question below

In Silverlight 2 Beta 2 there was a
significant change in the concurrency
model used for asynchronous
communications. In Beta 1 these type
of requests returned on the UI thread.
In Beta 2, when you choose to use the
BeginGetResponse of the WebRequest you
are telling Silverlight to use a
worker thread that comes from a thread
pool. As a result, you can NOT update
any user interface elements on the UI
thread. Using Dispatcher.BeginInvoke
is a way to get a method to fire back
on the UIThread from this threadpool
thead. Any interaction with
UIelements from the Async callback
will throw a cross thread exception.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文