Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 使用非UI线程从silverlight客户端调用WCF服务_Wpf_Silverlight - Fatal编程技术网

Wpf 使用非UI线程从silverlight客户端调用WCF服务

Wpf 使用非UI线程从silverlight客户端调用WCF服务,wpf,silverlight,Wpf,Silverlight,我有一个非常简单的场景: 我的silverlight应用程序中有一个异步WCF服务调用。 我希望在单独的线程(或类似线程)上执行这些操作,因为它们冻结了我的UI。 所有服务调用都是为了更新ViewModel,从而更新页面上的/a UI控件,因此需要从运行服务调用的线程中找到一种方法来实现这一点,而无需获得熟悉的跨线程异常。 有什么建议吗 非常感谢 您可以使用,也可以使您的客户端代理支持 确保将UI更新发送到正确的线程,如下所述: 在与WCF团队成员交谈时,这是我对其工作原理的理解。如果您只是从后

我有一个非常简单的场景:
我的silverlight应用程序中有一个异步WCF服务调用。
我希望在单独的线程(或类似线程)上执行这些操作,因为它们冻结了我的UI。
所有服务调用都是为了更新ViewModel,从而更新页面上的/a UI控件,因此需要从运行服务调用的线程中找到一种方法来实现这一点,而无需获得熟悉的跨线程异常。
有什么建议吗

非常感谢

您可以使用,也可以使您的客户端代理支持

确保将UI更新发送到正确的线程,如下所述:

在与WCF团队成员交谈时,这是我对其工作原理的理解。如果您只是从后台线程进行调用,它将不起作用,因为WCF子系统将把调用封送回您最初打开连接的线程(通常是UI线程)。因此,您需要做的是创建一个工作线程,然后从该线程显式打开连接。然后,无论何时进行调用,它都会被封送回该线程。当然,一旦收到回调并完成处理(在后台线程上),请确保使用Dispatcher.BeginInvoke()将任何UI更改封送回UI线程。

Dispatcher.BeginInvoke是最佳解决方案

服务代理的部分定义:

public void GetItemById(int id, Action<ItemModel> callback)
{
    AsyncCallback onCompleted = ar => 
        Deployment.Current.Dispatcher.BeginInvoke(() => 
            callback(this.Channel.EndGetItemById(ar)));
    this.Channel.BeginGetItemById(id, onCompleted, null);
}

你让我很开心。我曾经遇到过这样一种情况:我想在一个句柄上等待UI线程,该句柄将由WCF调用完成的处理程序设置。嗯,那次通话从未结束,因为通话本身直到等待之后才开始!
var proxy = new MyServiceProxy();
proxy.GetItemById(5, item => this.Item = item);