我的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