我的ASP.Net C#Web应用程序允许其用户使用FTP将来自我服务器上帐户的文件发送到任何远程服务器。我已经实现了一个WCF服务来做到这一点。该服务为每个产生工作线程的用户实例化一个类,该工作线程在服务器上执行FTP操作。客户端向服务发送命令,服务找到分配给客户端的工作线程并启动FTP命令。然后,客户端每两秒轮询一次服务以获取FTP操作的状态。当客户端发送“disconnect”命令时,类和执行FTP操作的工作线程被销毁。我的WCF服务可以使用单例可缩放吗?
FTP工作线程需要在客户端的查询之间保留,因为FTP处理可能需要很长时间。所以,我需要一种方法让客户始终在对服务的调用之间获得相同的FTP类实例。我实现了这个服务作为一个单身,这样的:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
public class UserFtpService : IUserFtpService
{
private SortedDictionary<string, UserFTPConnection> _clients = new SortedDictionary<string, UserFTPConnection>();
...
}
其中“UserFTPConnection”是包含工作线程和用户的帐户名是用于字典中的索引类。
我有这样的问题:在我读过关于WCF的书中,单例实例被称为“可伸缩性的敌人”。我明白为什么这样。有没有更好的方法来确保客户端获得UserFTPConnection的查询之间的WCF服务,而不是使用单例的同一个实例?
我没有显示代码的其余部分,因为这与我的问题无关,但对字典的访问位于“锁定”块内,因此可以正确同步。当我开始查找条目时,我的印象是“SortedDictionary”速度更快,这比插入或删除条目的速度更重要。我不知道C#中的任何排序的并发字典。 – Escovado
@Escovado,*排序字典*?从来没有听说过这样的事情。字典是散列表,用于执行密钥查找的设计,没有为这些数据结构定义每个命令或排序的概念。 –
是的,SortedDictionary在这里:http://msdn.microsoft.com/en-us/library/f7fta44c.aspx – Escovado