2013-05-20 46 views
2

我有使用WCF編寫的文件傳輸服務。它接收客戶端發送的文件。 客戶端inturn使用FileStream + MessageContract跨文件發送。我曾嘗試使用以下屬性WCF + Singleton +文件傳輸+多線程

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, 
ConcurrencyMode = ConcurrencyMode.Multiple)] 

我嘗試在客戶端本身使用多線程做成單的WCF文件傳輸服務。 每個線程創建一個channelfactory + proxy.CreateChannel的實例,並通過一個不同的文件發送到服務。我在服務端沒有任何鎖,它只允許一次傳送一個文件,在客戶端也是如此。該代碼是通過代碼沒有狀態持久性的一種。

我面臨的問題是,因爲我沒有看到多個線程試圖發送多個文件。每次我嘗試使用多個線程傳輸多個文件時,該服務類型不會在同一實例中接受多個文件。這會導致文件按順序而不是並行傳輸。我覺得從客戶端發送文件,但在服務端,它的種類只是被阻止了。

我嘗試使用ServiceThrottling屬性,但仍然沒有發現任何區別。 我在做什麼錯或是這種方法無效?

一個客戶端只能通過一個通道發送一個文件?許多線程可以不發送很多文件到同一個服務?有人可以幫幫我嗎。

感謝 桑迪普

+0

我讓它工作,我有一個鎖對象正好在服務的入口點。但我面臨更多問題。只有兩個文件在一個點上傳輸。是否還有其他需要添加的配置? – Sandepku

回答

2

我不想承認我在這個系列中遇到的愚蠢錯誤,但我承認,我是多麼的愚蠢。

  1. 單線程執行的原因。 由於我在服務入口的開頭立即放了一個鎖,在休息等待時只允許有一個線程被允許。

  2. 線程執行而不是很多的原因。 由於帶寬只有2MBPS,並且我試圖傳輸10個10MB的文件,所以我假設網絡正在被阻塞。當我嘗試使用10個文件,每個100KB多線程都像魅力一樣工作時,我也可以使用maxConcurrentCalls控制線程的入口。

乾杯,大家好,感謝YK1

BTW。如果我錯了,請糾正我關於網絡帶寬是罪魁禍首的假設。

0

嘗試設置屬性ServicePointManager.DefaultConnectionLimit在客戶端爲大於2的值。

+0

沒有傢伙,我刪除了整段代碼,而是添加了一個簡單的Debug.Writeline,並將該服務託管在控制檯應用程序中。令我驚訝的是,我可以看到,直到一個線程完成執行,下一個線程才被允許。我嘗試設置上述屬性,但沒有多大用處。與此同時,我嘗試了一個真正像魅力一樣工作的示例應用程序。基於serviceThrottling中的maxConcurrentCalls,我可以控制進入服務的線程數量。真的不知道發生了什麼。這與MessageContract有關嗎? – Sandepku

+1

好的 - 你的評論'只有兩個文件在一個點上傳輸。'讓我懷疑這個配置。我希望你能夠正確使用代理進行併發呼叫 - 而不是等待第二次呼叫之前的第一個響應。 – YK1

+0

此外,通過在每個線程中創建代理 - 您的客戶端將創建多個連接到服務。相反,只創建一個代理並在客戶端的所有線程之間共享它 - 看看這是否會對行爲做出任何更改 – YK1