来自Silverlight悬挂的WCF呼叫

来自Silverlight悬挂的WCF呼叫,wcf,silverlight,Wcf,Silverlight,不确定我是否做错了什么。。。但我正在尝试实现一个可以从WCF调用的WCF服务。我在客户机上实现了异步模式,调用如下: BasicHttpBinding basicHttpBinding = new BasicHttpBinding(); EndpointAddress endpointAddress = new EndpointAddress(AccountServiceURL); var personService = new ChannelFactory<IAccountService

不确定我是否做错了什么。。。但我正在尝试实现一个可以从WCF调用的WCF服务。我在客户机上实现了异步模式,调用如下:

BasicHttpBinding basicHttpBinding = new BasicHttpBinding();
EndpointAddress endpointAddress = new EndpointAddress(AccountServiceURL);
var personService = new ChannelFactory<IAccountService>(basicHttpBinding, endpointAddress).CreateChannel();

var result = personService.BeginRegister(username, password, email, null, null);
personService.EndRegister(result); // <-- failing here
在服务器上,如下所示:

[ServiceContract]
public interface IAccountService
{
    [OperationContract]
    void Register(string username, string password, string email);
}

如果您是在UI线程上调用它(您可能是这样),那么它将使Silverlight运行时崩溃。最后一个电话

personService.EndRegister(result); 

…将被阻止,根据我的经验,Silverlight运行时非常非常讨厌UI线程在这样的IO调用中被阻止。相反,您应该响应一个事件或回调,然后在该事件或回调处理程序中进行EndRegister调用。

据我所知,这是因为Silverlight的WCF基础设施根本不使用线程池。所以,对BeginXXX的调用并不是真正的异步调用

我也被这种奇怪的行为绊倒了:

var ar = svc.BeginXxx(null, null);
var response = svc.EndXxx(ar);
和我们的应用程序处理

var ar = svc.BeginXxx(null, null);
var response = svc.EndXxx(ar);