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

4

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

我的问题与客户端代理的使用有关,是更好地保持其开放并重用它来传输每个文件片段还是每次发送内容时都重新打开它?

3个回答

11
关闭代理服务器的原因是您可能已经有一个长期运行的会话占用系统资源(netTcpBinding使用传输级别的会话,wsHttpBinding可以使用基于安全性或可靠性的会话)。但是您是正确的-只要客户端代理没有处于故障状态,您完全可以重复使用它。
如果您想更进一步,并且如果您可以在服务器和客户端之间共享包含服务和数据契约的公共程序集,您可以将客户端代理创建拆分为两个步骤:
1. 创建一个 `ChannelFactory` 并缓存它 - 这是一个非常昂贵和消耗资源的操作;由于需要将其作为泛型并使用您的服务契约(接口)来实现,因此您需要能够在服务器和客户端之间共享契约。 2. 给定该工厂,您可以根据需要使用 `factory.CreateChannel()` 创建通道-这个操作比较轻量级且可以快速完成。
这是您可以探索的一种可能的优化方案-假设您控制通信的两端,并且可以在服务器和客户端之间共享合同程序集。

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

4
当使用这种策略时,您需要小心,不要试图重复使用处于故障状态的代理。 - Cocowalla
我的第一个想法是重用客户端代理,但是在我看到我们这里其他一些应用程序的使用情况时,似乎有一种倾向,即尽快使用和关闭它们。虽然没有人能够向我解释为什么。好的,Cocowalla! - Andrew

1
创建新代理需要大约50-100毫秒的时间,如果您的系统需要良好的扩展性,这是相当重要的时间。
在重用代理时,您必须小心其状态和线程问题。不要尝试使用已经忙于发送数据的代理来发送数据(或接收数据)。否则你会度过可怕的不眠之夜。
一种重用的方法是为代理设置一个[ThreadStatic]私有字段,并在每次需要发送数据时测试其状态和存在性。如果创建了一个新线程,则线程静态字段将为null,您需要创建一个代理。假设您有一个简单的线程模型,这将使不同的线程不会互相干扰,您只需要担心代理的故障状态。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接