Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#,WCF,何时重用客户端代理_C#_Wcf - Fatal编程技术网

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

C#,WCF,何时重用客户端代理,c#,wcf,C#,Wcf,我正在编写一个使用WCF传输文件的应用程序。传输是分段进行的,以便在任何不可预见的中断后可以恢复传输 我的问题是关于客户端代理的使用,最好是保持它打开并重新使用它来传输每个文件段,还是每次我想发送东西时都要重新打开它?您可以重新使用WCF客户端代理,这将使您的客户端应用程序更快,代理只会初始化一次。尽快关闭代理的原因是,您可能有一个连接系统资源的会话(netTcpBinding使用传输级会话,wsHttpBinding可以使用基于安全性或可靠性的会话) 但你是对的——只要客户端代理没有处于故障状

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


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

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

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

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

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

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

  • 考虑到该工厂,您可以根据需要使用
    factory.CreateChannel()
    创建频道-此操作“工作量”要小得多,并且可以快速、反复地完成


这是您可以研究的一种可能的优化方法-假设您控制通信的两端,并且您可以在服务器和客户端之间共享契约组件。

创建新代理大约需要50-100毫秒的时间,如果您的系统需要良好的可伸缩性,这将是一个非常重要的时间

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


重用的一种方法是,为代理提供一个
[ThreadStatic]
私有字段,并在每次需要发送数据时测试其状态和存在性。如果创建了一个新线程,线程静态字段将为null,您需要创建一个代理。假设您有一个简单的线程模型,这将防止不同的线程互相攻击,您只需担心代理的故障状态。

但在使用此策略时,您需要小心不要尝试重用处于故障状态的代理。我的第一个想法是重用客户端代理,但只是查看在某些应用程序中的使用情况我们这里的其他应用程序似乎倾向于使用并尽快关闭它们。但没人能向我解释原因。我会做科科瓦拉!谢谢你的建议,我会调查的。