【问题标题】:WCF Call from Silverlight hanging来自 Silverlight 的 WCF 调用挂起
【发布时间】:2010-01-19 20:11:11
【问题描述】:

不确定我是否做错了什么......但我正在尝试实现一个可以从 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

它挂在“EndRegister”调用上......它只是坐在那里,什么都不做。并且 firefox.exe 变得无响应。服务器似乎永远不会收到调用,因为我在方法调用上有一个断点。也许有人能看出我做错了什么?

合约在客户端是这样的:

[ServiceContract]
public interface IAccountService
{
    [OperationContract(AsyncPattern = true)]
    IAsyncResult BeginRegister(string username, string password, string email, AsyncCallback callback, Object state);

    void EndRegister(IAsyncResult result);
}

并在服务器上这样:

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

【问题讨论】:

    标签: wcf silverlight


    【解决方案1】:

    如果您在 UI 线程(您可能是)上调用它,那么它会使您的 Silverlight 运行时崩溃。最后的电话……

    personService.EndRegister(result); 
    

    ...将会阻塞,根据我的经验,当 UI 线程在这样的 IO 调用上被阻塞时,Silverlight 运行时真的非常讨厌它。您应该改为响应事件或回调,然后在该事件或回调处理程序中进行 EndRegister 调用。

    【讨论】:

      【解决方案2】:

      据我所知,这是因为 Silverlight 的 WCF 基础结构根本不使用 ThreadPool。所以,对 BeginXXX 的调用并不是真正的异步调用......

      我也偶然发现了这种非常奇怪的行为:

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

      还有我们的应用程序。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-05-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-19
        • 2012-10-18
        • 1970-01-01
        相关资源
        最近更新 更多