代码之家  ›  专栏  ›  技术社区  ›  Bablo

在silverlight中使用WCF CloseAsync

  •  3
  • Bablo  · 技术社区  · 14 年前

    这是在silverlight中关闭与WCF的连接的正确方法吗?

    ServiceClient client = new ServiceClient();
    
            client.MakeRequestCompleted += (sender, e) =>
                {
                    client.CloseAsync();
    
                    //some implementation goes here
                };
    
            for (int i = 0; i < 1000; i++)
            {
                client.MakeRequestAsync();
            }
    

    我似乎遇到了与并发连接相关的问题,当循环到达发出大约300个请求的点时,它就失败了。谢谢。

    2 回复  |  直到 14 年前
        1
  •  0
  •   Phil Gan    14 年前

    我不是专家,但我一直在研究一个类似的问题,没有人留下答案。。。

    在不保证完成1000个web服务调用的操作的情况下,您正在关闭客户端。我还发现在 CloseAsync 但是 accepted wisdom 好像要打电话来 关闭异步 完成所有web服务调用后。

    另外,在你的应用程序中调用上千个web服务可能是危险的——显然,我不知道你的情况的来龙去脉,但最好是将你的调用组合成更少、更大的操作。

        2
  •  0
  •   Tuomas Hietanen    14 年前

    http://forums.silverlight.net/forums/p/29299/95656.aspx


    1: ServiceClient client = new ServiceClient();
    2: client.MakeRequestCompleted += (sender, e) =>...
    3: client.MakeRequestAsync();
    

    MakeRequestCompleted是一个委托。请求完成后,将执行调用。

    如果将第1行和第2行设为所有请求的公共行,则会将具有相同参数的同一事件绑定到每个请求。然后在实现代码中,您并不真正知道是哪个调用导致了哪个事件。[1]

    所以,如果您只为每个请求生成所有这些行,您可以测试性能受到多大的影响吗?

    for (int i = 0; i < 1000; i++)
    {
        ServiceClient client = new ServiceClient();
        client.MakeRequestCompleted += (sender, e) =>...
        client.MakeRequestAsync();
    } 
    


    [1] :如果您只构建这样的“hammer客户机”,这可能是可以的,但是如果您需要一些真正的实现,公共事件参数可能不够。