我有一个UI应用程序,我在其中使用像这样的WCF服务
public MainWindow()
{
....
mServiceClient = new ServiceClient("EndPointTCP");
}
我应该将客户端创建为类的成员并关闭客户端以及退出应用程序,还是应该在方法中需要时创建新客户端并自行关闭。
答案 0 :(得分:1)
这完全取决于你想要达到的目标。没有“最好的方法”,因为这两种方式都是可能的,良好的,并且有不同的权衡。
持有客户端对象只会浪费资源。它还可能在呼叫之间泄漏上下文数据。您可能有一个错误会导致mClient.Buy(100)
和mClient.Sell(100)
单独使用时正常工作,但在一起使用时会失败mClient.Buy(100); mClient.Sell(100)
。每次删除和重新创建新实例都可以让你免于那个错误,但显然这不是一个很好的论据。
每次拨打电话时重新创建客户端都会产生模糊的好处......每次都有一个新客户。如果您的应用程序可以在应用程序的运行时动态更改端点,那么您的客户端将始终使用最新的地址/登录/密码/等。
但是,不是每次都重新创建客户端对象只是更快。请注意,它是WCF层,因此实际的底层连接可以是任何。如果它是一些具有大量设置和一些密钥交换,加密等的协议,您可能会发现每次创建一个新客户端可能每次都会创建一个新连接并且它会减慢传送速度,同时保持实例的运行速度非常快,连接可能会保持打开并重复使用。通常,当您必须执行许多操作并经常调用服务时,您会尝试保持连接,例如24小时/天两次/秒监视某些远程值以突破安全限制。
另一方面,可能不希望连接延迟。您的远程服务可能有数千个客户端和有限的资源,因此您可能希望尽快关闭连接,以便其他人可以连接。通常你会这样做,当很少做一次调用服务时,即。当用户从咖啡休息时间返回后点击。
请不要误解我的意思:以上所有只是从空虚中捏造出一些模糊的“事实”。我不知道你的应用程序,你的服务,也不知道你的绑定(没有“端点TCP”)。最重要的因素都在您身边,它们以实际的方式与您的应用程序和远程服务的工作方式和互操作性保持一致。如果您关心您的要求,您必须首先简单地研究您的主题。最好 - 只需尝试两种方式并检查它是否有效以及它是如何运作的。
,差别很大,就像2..6行代码一样答案 1 :(得分:0)
已经有一些类似的问题:
在我看来,这取决于您的应用程序类型(可伸缩性,性能要求......),但通常我认为每次重新创建ServiceClient
更安全。这样,如果请求之间存在连接问题,并且最新版本的WCF似乎没有产生很大的性能影响,则不需要特殊代码。
请参阅http://msdn.microsoft.com/en-us/library/aa738757.aspx。
还要考虑ServiceClient
不是线程安全的(至少阅读MSDN)。