在silverlight中使用WCF CloseAsync

时间:2010-09-08 11:05:13

标签: c# silverlight wcf

这是在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 个答案:

答案 0 :(得分:0)

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

您正在关闭您的客户端而不保证您的操作已完成1000次Web服务调用。我发现在CloseAsync方法上找到文档有点困难,但accepted wisdom似乎是在您完成所有网络服务调用后调用CloseAsync

此外,在您的应用中拨打一千个网络服务电话可能会很危险 - 显然我不知道您的情况的来龙去脉,但最好将您的电话合并为更少,更大的操作。

答案 1 :(得分:0)

此引用表示您不必关闭请求: 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]

如果你试图使第1行成为常见的,那么你将会有越来越多的事件,你无法以线程安全的方式取消订阅。

那么,如果你只是为每个请求制作所有这些行,你能测试多少性能?

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

(当然,你应该使用缓存并使用更少的请求。)


[1]:如果您构建这样的“锤子客户端”,这可能没问题,但是如果您需要一些真正的实现,常见的事件参数可能还不够。