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);