2016-10-06 48 views
0

我們已經將服務行爲設置爲[ServiceBehavior(Namespace =「abc」,InstanceContextMode = InstanceContextMode.PerSession,ConcurrencyMode = ConcurrencyMode.Single,UseSynchronizationContext = false)]WCF InstanceContextMode = InstanceContextMode.PerSession&ConcurrencyMode = ConcurrencyMode.Single仍然在TraceLog中有不同的ThreadID

正如你所看到的,我們已經將併發模式設置爲Single,但是我們仍然可以在WCF Trace Log中看到多個ThreadID。

需要幫助使WCF調用線程安全,以便每個消息按順序處理。

謝謝, Srujal

回答

0

ConcurrencyMode控制每的InstanceContext穿線。由於您使用的是InstanceContextMode = InstanceContextMode.PerSession,因此您仍然允許同時存在多個服務實例,每個會話一個。

如果您改爲設置InstanceContextMode = InstanceContextMode.Single,您將創建一個單例服務,即只有一個服務實例。在與ConcurrencyMode = ConcurrencyMode.Single組合,這將實現所需的行爲:

服務實例是單線程的,不接受重入調用。如果InstanceContextMode屬性爲Single,並且在實例爲呼叫提供服務時附加消息到達,則這些消息必須等到服務可用或消息超時之前。 (MSDN documentation ConcurrencyMode)

您可以在MSDN上的Sessions, Instancing, and Concurrency上閱讀更多信息。

+0

嗨nodots,感謝您的幫助我曾嘗試過,並將最大併發調用的throttling屬性設置爲1,但仍然能夠在wcf跟蹤日誌中看到不同線程標識,還有其他任何想法可供查看相同。 –

+0

通過上面的設置,不應該有不同的線程ID **在同一時間**。然而隨着時間的推移,這只是服務主機如何處理線程的問題:以前的線程可能會被銷燬並創建一個新線程。 – nodots

+0

Ohkk,非常感謝nodots問題得到解決:) –

相關問題