在 silverlight 中使用 WCF CloseAsync
Posted
技术标签:
【中文标题】在 silverlight 中使用 WCF CloseAsync【英文标题】:Using WCF CloseAsync in silverlight 【发布时间】:2011-04-09 16:23:55 【问题描述】:这是在 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 个请求的地步时,它就失败了。谢谢。
【问题讨论】:
【参考方案1】:我不是专家,但我一直在研究类似的问题,但没有其他人给出答案...
您正在关闭您的客户端,但不保证您进行 1000 次 Web 服务调用的操作已完成。我还发现找到有关 CloseAsync
方法的文档有点困难,但是在您进行所有 Web 服务调用之后,accepted wisdom 似乎要调用 CloseAsync
。
此外,在您的应用中调用一千次 Web 服务可能很危险 - 显然我不知道您的情况的来龙去脉,但最好将您的调用合并到更少、更大的操作中。
【讨论】:
我在网上看到一个实现,它建议将“(e as ServiceClient).CloseAsync()”添加到已完成的事件中,从那时起它就起作用了。我相信每个异步调用都是与 Web 服务的唯一连接,它会自动关闭但不会立即关闭,从而造成瓶颈,导致 Web 服务请求失败。如果您在完成的事件中关闭每个连接,则可以防止发生瓶颈。 是的,这就是我通常会这样做的方式,但他使用一个客户端对象进行 1000 个并发操作。谁知道会发生什么?【参考方案2】:此参考表明您不必关闭请求: 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]:如果你只构建一个像这样的“锤子客户端”,这可能没问题,但如果你需要一些真正的实现,普通的事件参数可能不够。
【讨论】:
以上是关于在 silverlight 中使用 WCF CloseAsync的主要内容,如果未能解决你的问题,请参考以下文章
Silverlight 应用程序的 Azure WorkerRole 中的 WCF 服务
使用 Silverlight 5、IIS 7.5 对 WCF 服务进行 Windows 身份验证