我正在编写一个使用WCF传输文件的应用程序。转移是分段完成的,以便在任何不可预见的中断后恢复。
我的问题是关于客户端代理的使用,最好是保持打开并重新使用它来传输每个文件段,还是每次我想发送东西时都应该重新打开它?
答案 0 :(得分:11)
尽快关闭代理的原因是您可能正在建立一个占用系统资源的会话(netTcpBinding使用传输级会话,wsHttpBinding可以使用基于安全性或基于可靠性的会话)。
但是你是对的 - 只要客户端代理不处于故障状态,你就可以完全重用它。
如果您想更进一步,如果您可以与服务器和客户端之间的服务和数据协定共享通用程序集,则可以将客户端代理创建分为两个步骤:
创建一次ChannelFactory<IYourServiceContract>
并缓存 - 这是一项非常昂贵且资源密集型的操作;因为您需要使用服务合同(接口)使其成为通用的,所以您需要能够在服务器和客户端之间共享合同
鉴于工厂,您可以根据需要使用factory.CreateChannel()
创建频道 - 此操作不那么“沉重”,可以快速反复完成
这是您可以查看的一种可能的优化 - 给定您控制通信两端的方案,并且您可以在服务器和客户端之间共享合同程序集。
答案 1 :(得分:3)
您可以重复使用您的WCF客户端代理,这将使您的客户端应用程序更快,因为代理只会初始化一次。
答案 2 :(得分:1)
创建一个新代理需要大约50-100毫秒的时间,如果你的系统需要良好的扩展,这是非常重要的时间。
重用代理时,必须注意其状态和线程问题。不要尝试使用已经忙于发送数据的代理发送数据。 (或接收)你将有可怕的不眠之夜。
重用的一种方法是,为代理设置一个[ThreadStatic]
私有字段并测试其状态&amp;每次需要发送数据时都存在。如果创建了新线程,则线程静态字段将为null,您将需要创建代理。假设你有一个简单的线程模型,这将使不同的线程不会踩到彼此的脚趾,你只需要担心代理的故障状态。