C#,WCF,何时重用客户端代理

我正在编写一个使用WCF传输文件的应用程序。 转移是分段完成的,以便在任何不可预见的中断后恢复。

我的问题是关于客户端代理的使用,是不是更好地保持它打开并重用它来传输每个文件段,还是每次我想发送东西时我应该重新打开它?

您可以重用WCF客户端代理,这将使您的客户端应用程序更快,因为代理只会初始化一次。

尽快关闭代理的原因是您可能正在建立一个占用系统资源的会话(netTcpBinding使用传输级会话,wsHttpBinding可以使用基于安全性或基于可靠性的会话)。

但你是对的 – 只要客户端代理不处于故障状态,你就可以完全重用它。

如果您想更进一步,并且如果您可以与服务器和客户端之间的服务和数据协定共享公共程序集,则可以将客户端代理创建分为两个步骤:

  • 创建一个ChannelFactory并缓存它 – 这是一个非常昂贵且资源密集的操作; 因为您需要使用服务合同(接口)使其成为通用的,所以您需要能够在服务器和客户端之间共享合同

  • 鉴于该工厂,你可以根据需要使用factory.CreateChannel()来创建你的频道 – 这个操作不那么“沉重”,可以一次又一次地快速完成

这是您可以查看的一种可能的优化 – 给定您控制通信两端的方案,并且您可以在服务器和客户端之间共享合同程序集。

创建新代理需要大约50-100毫秒的时间,如果您的系统需要良好的扩展,这是非常重要的时间。

重用代理时,必须注意其状态线程问题。 不要尝试使用已经忙于发送数据的代理发送数据。 (或接收)你将有可怕的不眠之夜。

重用的一种方法是,为代理提供[ThreadStatic]私有字段,并在每次需要发送数据时测试其状态和状态。 如果创建了新线程,则线程静态字段将为null,您将需要创建代理。 假设你有一个简单的线程模型,这将使​​不同的线程不会踩到彼此的脚趾,你只需要担心代理的故障状态。