2009-12-17 68 views
4

我正在编写一个使用WCF传输文件的应用程序。这些转移是分段完成的,以便在任何不可预见的中断后恢复。C#,WCF,何时重用客户端代理

我的问题涉及到客户端代理的使用,是否更好地保持它打开并重用它来传输每个文件段,或者我应该在每次我想发送一些内容时重新打开它?

回答

3

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

+4

但是您需要小心,不要尝试重复使用此策略时处于故障状态的代理。 – Cocowalla 2009-12-17 10:12:31

+0

我的第一个想法是重用客户端代理,但只是看看我们在这里的其他一些应用程序中的使用情况,似乎有倾向尽快使用并关闭它们。尽管如此,没有人能够向我解释。 会做科科瓦拉! – Andrew 2009-12-17 10:45:27

10

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

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

如果你想更进一步,如果你能共享服务器和客户端之间的服务和数据契约共同组装,你可以在客户端创建代理分成两个步骤:

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

  • 假设工厂,您可以根据需要使用factory.CreateChannel()创建您的渠道 - 此操作是更“重”,可以快速,一遍又一遍做

这是一个可能的优化,你可以考虑 - 因为你控制通信的两端的情况下,你可以分享合同服务器和客户端之间的组装

+0

谢谢你的这个想法,我看着它。 – Andrew 2009-12-17 16:10:28

1

如果您的系统需要良好的缩放比例,那么创建新代理需要大约50-100毫秒的时间,这是相当长的一段时间。

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

重复使用的一种方法是,每次需要发送数据时,代理都有一个[ThreadStatic]专用字段,并测试其状态为&。如果创建了新线程,线程静态字段将为空,您需要创建一个代理。假设你有一个简单的线程模型,这将保持不同的线程彼此踩脚趾,你只需要担心代理的错误状态。