2010-10-19 152 views
6

我已經創建了一個簡單的WCF(.NET 3.5)服務,它定義了10個基本上是對提供的數據進行計算的合同。目前我希望很少的客戶能夠打電話給這些合同。如何讓服務更具響應性?我有一種感覺,那就是服務會一直等到它處理一個請求去下一個請求。 如何在WCF中使用多線程來加快速度?WCF服務和線程

+0

當我說你經歷了緩慢的反應時,我很理解你嗎?客戶打幾次電話可以讓我們說一分鐘。什麼是慢? – 2010-10-19 14:28:23

回答

18

雖然我Justin's answer同意,我相信更多的光可以在這裏闡明WCF是如何工作的。

您做出特別聲明:

我有一種感覺,該服務將 等待,直到它處理一個請求 去下一個。我如何在WCF中使用 多線程來加快 的速度?

服務的併發性(可同時接收多少個呼叫)取決於連接到該服務的ConcurrencyMode value for the ServiceBehavior。默認情況下,該值爲ConcurrencyMode.Single,這意味着它會逐個序列化調用。

但是,這可能不像您想象的那麼嚴重。如果你的服務的InstanceContextMode等於InstanceContextMode.PerCall那麼這是一個沒有問題的;您的服務的新實例將在每次通話時創建,並且不會用於任何其他通話。

但是,如果您有一個單例或基於會話的服務對象,那麼對該服務實現實例的調用將被序列化。

您可以隨時更改ConcurrencyMode,但請注意,如果您這樣做,則必須手動處理併發問題並訪問您的資源,因爲您明確告訴WCF您將這樣做。

重要的是不要因爲你認爲它會導致性能提高而改變這些。雖然併發性並不是很高,但服務的實例化方面非常重要(如果它是會話或不是基於會話的),並且改變它們會影響使用該服務的客戶端,所以不要這樣做它輕輕一點。

當然,這並不涉及實際上實施服務的代碼是否有效。當你指出情況時,這絕對是需要研究的東西。

3

這絕對是過時的優化。首先實施你的服務,看看是否有問題。

我想你會發現你一無所知。當請求處理時,服務器不會阻塞單個請求。 IIS/WCF應該按照原樣爲你處理事情。

1

我不熟悉WCF,但可以進程是異步嗎? 如果您期待大量的數據和密集計算,則可以發送一個選項id,在單獨的線程中計算值,然後提供一種方法,使用初始值id返回結果。

喜歡的東西:

int id = Service.CalculateX(...); 
... 
var y = Service.GetResultX(id);