2012-09-19 45 views
3

我有一個ServiceBehavior(InstanceContextMode = InstanceContextMode.Single,ConcurrencyMode = ConcurrencyMode.Multiple)的WCF服務。我想使用ThreadStatic變量來存儲數據。當併發模式=多個時,兩個並行WCF請求可以被同一個線程處理

我開始擔心是否有可能爲相同或不同的operationContracts的兩個並行請求獲得相同的線程服務器端處理,因爲如果發生這種情況,我的ThreadStatic變量將被覆蓋(即線程在HttpHandlers和HttpModules之間切換在ASP.NET中)

我使用相同的ServiceBehaviour和maxConcurrentCalls =「2」創建了一個尖峯服務。之後,一個wcf客戶端用50個並行請求調用服務,我的擔心沒有發生。然而,這不是100%的證據。

提前致謝!

回答

4

無論使用何種ConcurrencyMode,當請求終止並且線程返回到線程池時,ThreadStatic值都將保留。同一個線程可以重複用於後續請求,因此可以看到您的ThreadStatic值。

很明顯,這兩個併發請求不會是真的,因爲根據定義,它們將在不同的線程上執行。

從評論:

此外,通過定義MSDN說:「服務實例是多線程的。沒有同步保證。因爲其他線程可以隨時更改您的服務對象,所以您必須始終處理同步和狀態一致性。'因此,它是不那麼明顯:)

這意味着你的服務類的一個實例可以通過多個請求同時訪問。因此,您需要處理對服務類的實例成員的任何訪問的同步。

但是ThreadStatic成員根據定義一次只能由一個線程(因此一次請求)使用,所以不需要同步。

+0

您好,感謝您的快速回復。我在ThreadStatic變量周圍有一個處理包裝器(例如,我使用的是環境設計模式),所以在線程重用期間我沒有任何問題。另外根據定義MSDN說:'服務實例是多線程的。沒有同步保證。因爲其他線程可以隨時更改您的服務對象,所以您必須始終處理同步和狀態一致性。'所以它不是那麼明顯:) –

+0

+1喬,很好的回答! –

0

我想在此添加Joe的回答,因爲如果您需要存儲狀態,我會建議您爲請求使用某種關聯。線程模型在生產中將變得非常複雜且不可靠。

此外,現在想象一下,您有兩臺託管此服務的IIS服務器和一臺硬件或軟件負載平衡器,以便您可以使用它。爲了確保收集到正確的狀態,您需要進行關聯,因爲您永遠不知道該服務將啓動到哪個服務器。在下面的帖子中,我嘲笑了一個可能工作的簡化版本。需要注意的一點是,SessionState需要保存在服務的所有實例的共享位置,例如AppFabric Cache服務器。

Global Variable between two WCF Methods

1

直接回答你的問題是喬的回答。

但是,您在評論中提到您正在使用環境設計模式。該模式已經在WCF中作爲OperationContext實現,並且專門設計爲可擴展的。我強烈建議在任何自定義線程存儲上使用OperationContext。

Where to store data for current WCF call? Is ThreadStatic safe?

+0

感謝您提醒我注意WCF的可擴展性。但是我會繼續使用我的方法,因爲我應該可以在ASP.NET上下文中使用它。 –

相關問題