这是在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个请求时,它就会失败。感谢。
答案 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]:如果您构建这样的“锤子客户端”,这可能没问题,但是如果您需要一些真正的实现,常见的事件参数可能还不够。