2010-09-08 53 views
3

这是在Silverlight中关闭与WCF的连接的正确方法吗?在Silverlight中使用WCF CloseAsync

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

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

你关闭你的客户不保证您的操作,使1000调用Web服务有完了。我还发现在CloseAsync方法中找到文档有点困难,但在您完成所有Web服务调用后,accepted wisdom似乎要拨打CloseAsync

另外,在您的应用中创建千次的Web服务调用可能很危险 - 显然我不知道您的情况来龙去脉,但将您的调用结合到更少,更大的操作中可能会更好。

+0

我看到一个在线实现,建议在已完成的事件中添加“(e作为ServiceClient).CloseAsync()”,从此开始工作。我相信每个异步调用都是与Web服务的唯一连接,它会自动关闭,但不会立即关闭,从而造成导致Web服务请求失败的瓶颈。如果在完成的事件中关闭每个连接,则可以防止出现瓶颈。 – Bablo 2010-10-12 11:38:07

+0

是的,这就是我通常这样做的方式,但是他为1000个并发操作使用了一个客户端对象。谁知道会发生什么? – 2010-10-12 12:14:48

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]

如果您尝试制作一条常见的线条,您将会有越来越多的活动,并且您无法真正以线程安全方式取消订阅。

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

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

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


[1]:如果你建立只是一个“锤客户端”像这样的,这可能是好的,但是如果你需要一些真正的实现,常见的事件参数可能不够。