2010-11-03 89 views
1

我有一个非常简单的场景:
我的Silverlight应用程序中有一个异步WCF服务调用。
我想执行那些在一个单独的线程(或类似的),因为他们冻结了我的用户界面。
所有的服务调用都是为了更新ViewModel,从而更新页面上的一个UI控件,所以需要从运行服务调用的线程中找到一种方法,而不会遇到熟悉的跨线程异常。
有什么建议吗?使用非UI线程从silverlight客户端调用WCF服务

非常感谢。

回答

0

Dispatcher.BeginInvoke是最好的解决方案。

服务代理的部分认定中:从MVVM

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

电话:

var proxy = new MyServiceProxy(); 
proxy.GetItemById(5, item => this.Item = item); 
3

与在WCF团队乡亲讲,这是我它是如何工作的理解。如果您只是简单地从后台线程进行调用,那么它将不起作用,因为WCF子系统会将调用回传到您最初打开连接的线程(通常是UI线程)。所以你必须做的是创建一个工作者线程,然后明确地从该线程打开连接。然后,每当你打电话时,它都会被封送回该线程。当然,一旦你已经收到你的回调并完成你的处理(在后台线程上),那么请确保你使用Dispatcher.BeginInvoke()将任何UI变更编组回UI界面。

+0

你只要让我很快乐。我有一种情况,我想等待一个由WCF调用完成的处理程序设置的句柄上的UI线程。那么,这个通话完成永远不会发生,因为通话本身甚至不能开始,直到等待之后! – Kit 2011-08-29 23:04:32

相关问题