2012-04-03 57 views
2

如果我運行我的WCF服務(在II7中託管)並在contextinstance上使用PerSession,一個會話是否與一個線程相同?當客戶沒有打任何電話但服務上有會話時會發生什麼?會議仍在進行中?WCF 1 Sesssion = 1線程?

如果我更改爲PerCall,我會在每次調用時獲得一個線程,並且在調用結束時返回此線程。

我在哪裏可以找到這些信息?

回答

3

我相信你可以找到答案和很好的解釋here

在你一眼就使用對於通常的網絡場景可伸縮性原因PerCallPerSession

  • 當使用PerSession一旦客戶沒有服務實現的第一個呼叫實例將被保存在服務器上。每個客戶端都有自己的會話,每個客戶端只能在一個線程上執行(!)所以,是的1 Session == 1默認線程。但您也可以更改併發模式,因此在一個會話中,客戶端可以執行許多併發呼叫。

  • 如果是PerCall服務實例將在呼叫完成後立即處理。

[編輯(大衛納爾遜討論之後)]:

這並不意味着在同一個線程(!)!它只意味着ThreadPool將使用可用的線程來運行服務代碼。但是,如果啓動1000個併發客戶機,ThreadPool將分配多個線程,這涉及資源(如內存)。與代碼線程使用的

說明:

我創建簡單的計算器服務,以示對WCF服務如何踐踏的作品。

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)] 
public class CalculatorService : ICalculatorService 
{ 
    private int _threadIdOnCreating = Thread.CurrentThread.ManagedThreadId; 
    public int AccumulatedValue { get; private set; } 
    public int Accumulate(int valueToAdd) 
    { 
     AccumulatedValue += valueToAdd; 

     Console.WriteLine(
string.Format("Accumulated: {0}. ThreadIdOnServiceCreating:{1} CurrentThreadId:{2}", 
      AccumulatedValue, _threadIdOnCreating, Thread.CurrentThread.ManagedThreadId)); 

     return AccumulatedValue; 
    } 
} 

我運行累積方法與參數2五次,然後創建新的客戶端代理,並做了同樣的事情。 以下是輸出,它證明服務器保留服務實現的實例(創建時爲threadId),但方法在不同線程上運行,取自ThreadPool。

I'm calculator 
Accumulated: 2. ThreadIdOnServiceCreating:6 CurrentThreadId:6 
Accumulated: 4. ThreadIdOnServiceCreating:6 CurrentThreadId:7 
Accumulated: 6. ThreadIdOnServiceCreating:6 CurrentThreadId:6 
Accumulated: 8. ThreadIdOnServiceCreating:6 CurrentThreadId:7 
Accumulated: 10. ThreadIdOnServiceCreating:6 CurrentThreadId:6 
Accumulated: 2. ThreadIdOnServiceCreating:9 CurrentThreadId:9 
Accumulated: 4. ThreadIdOnServiceCreating:9 CurrentThreadId:6 
Accumulated: 6. ThreadIdOnServiceCreating:9 CurrentThreadId:9 
Accumulated: 8. ThreadIdOnServiceCreating:9 CurrentThreadId:6 
Accumulated: 10. ThreadIdOnServiceCreating:9 CurrentThreadId:8 
+0

您引用的文檔沒有提及每個客戶端在一個線程上執行的每個會話的任何內容。你是如何得出這個結論的? – 2012-04-03 21:12:44

+0

例如在此處閱讀:http://mkdot.net/mknetug/b/dejan/archive/2008/04/29/wcf-service-behaviors-instance-and-concurrency-management.aspx – 2012-04-03 21:16:49

+0

該文章措辭不佳並最終不準確。後續對同一會話的請求可以在不同的線程上執行。建立一個服務來證明這一點很容易。 – 2012-04-03 21:30:44

1

「如果我跑我的WCF服務(在II7託管)和contextinstance使用PerSession,將一個會話是相同的一個線程?」

不,請求將由線程池處理。

「當客戶端沒有進行任何呼叫但服務上有會話時會發生什麼?會話是否還在線程中?

不,如果沒有請求正在服務,則會話不佔線。WCF「會話」只是數據;狀態綁定到會話ID。它與線程無關。

+0

當你說這個請求將被線程池處理時,它和使用線程不一樣,即使它是由ThreadPool分配的嗎? – 2012-04-03 21:14:28

+0

不,這是不一樣的。特別是,不能保證在同一會話上的後續請求將使用與先前請求使用的線程相同的線程;當一個線程池線程可用時,新請求將由線程池線程提供服務。 – 2012-04-03 21:31:36

+0

嗨...所以我其實並沒有把你的話和建立服務與會話來驗證。另外一個線程可以被一個客戶端用於同一個會話。但無論如何,這隻意味着ThreadPool被有效地使用。但是,如果您啓動1000個併發客戶端,ThreadPool將分配多個涉及資源的線程 – 2012-04-03 21:45:09

相關問題