2

I have a UI application in which I consume a WCF service like this

public MainWindow()
{
    ....
    mServiceClient = new ServiceClient("EndPointTCP");
}

Should I create the client as a member of class and close the client along with exit of my application or Should I create a new client whenever its required in a method and close there itself.

4

2 回答 2

1

这完全取决于您想要实现的目标。没有“最好的方法”,因为这两种方法都是可能的、好的,并且有不同的权衡。

持有客户端对象只会浪费资源。它还可能在调用之间泄漏上下文数据。您可能有一个错误,它在单独使用时会导致mClient.Buy(100)mClient.Sell(100)正常工作,但在一起使用时会失败mClient.Buy(100); mClient.Sell(100)。每次删除并重新创建新实例可以使您免于该错误,但显然这不是一个好的论据。

每次拨打电话时重新创建客户都有一个模糊的好处……每次都有一个新客户。如果您的应用程序有可能在应用程序运行时动态更改端点,那么您的客户端将自动始终使用最新的地址/登录名/密码/等。

但是,不每次都重新创建客户端对象会更快。请注意,它是 WCF 层,因此实际的底层连接可以是任意的。如果它是一些带有一些密钥交换、加密等的繁重设置的协议,你可能会发现每次创建一个新客户端都可能每次都创建一个新连接,它会减慢一切,同时保持实例的工作速度非常快,因为连接可能会保持打开和重用。当您必须对服务执行多次且经常调用时,您通常会尝试保持连接,例如 24 小时/天两次/秒监控某些远程值是否违反安全限制。

另一方面,您可能不希望这种联系持续存在。您的远程服务可能有数千个客户端和有限的资源,因此您可能希望尽快关闭连接,以便其他人可以连接。当对服务的调用真的很少完成时,通常你会这样做,一次只有一次,即。当用户从咖啡休息时间返回后点击。

请不要误会我的意思:以上只是从虚无中变出一些模糊的“事实”。我不知道您的应用程序、服务和绑定(没有“端点 TCP”)。最重要的因素都在您身边,它们以您的应用程序和远程服务如何工作和互操作的实际方式存在。如果您关心您的要求,您必须首先简单地研究您身边的主题。最好 - 只需尝试两种方式并检查它是否有效以及它的性能如何。区别大概是 2..6 行代码,所以,嗯,相当快。

于 2013-09-26T07:54:44.037 回答
0

已经有一些类似的问题:

在我看来,这取决于您的应用程序类型(可扩展性、性能要求……),但通常我认为ServiceClient每次重新创建更安全。这样,如果请求之间存在连接问题,则不需要特殊代码,并且最新版本的 WCF 似乎对性能影响不大。请参阅http://msdn.microsoft.com/en-us/library/aa738757.aspx

还要考虑这ServiceClient不是线程安全的(至少阅读MSDN)。

于 2013-09-26T07:58:22.030 回答