在 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的主要内容,如果未能解决你的问题,请参考以下文章

ssl、silverlight、wcf 和本地安装

●创建silverlight+wcf

Silverlight 应用程序的 Azure WorkerRole 中的 WCF 服务

使用 Silverlight 5、IIS 7.5 对 WCF 服务进行 Windows 身份验证

我是不是必须使用 WCF 对 silverlight 应用程序中的对象进行序列化/反序列化?

Silverlight 启用 WCF 服务、Web 服务、ADO.NET 数据服务