WCF并發(fā)模型應(yīng)用特點簡要評比
在WCF中,有很多比較重要的基礎(chǔ)知識,是需要我們初學(xué)者在學(xué)習(xí)的過程中加重注意的。今天,我們?yōu)榇蠹医榻B的就是其中一個比較重要的知識點,WCF并發(fā)模型的一些應(yīng)用特點等。希望可以給大家?guī)硪韵聨椭?t#
ServiceBehavior.ConcurrencyMode 用于控制具體服務(wù)對象的并發(fā)行為。有三種模型:
Single: 默認方式。服務(wù)實例是 single-threaded,不接受重入調(diào)用(reentrant calls)。也就是說對于同一個服務(wù)實例的多個調(diào)用必須排隊,直到上一次調(diào)用完成后才能繼續(xù)。
Reentrant: 和 Single 一樣,也是 single-threaded,但能接受重入調(diào)用,至于針對同一服務(wù)對象的多個調(diào)用依然需要排隊。在 Single 模式下,當(dāng)方法調(diào)用另外一個服務(wù)(Callback是客戶端提供的服務(wù))時,方法會阻塞,直到所調(diào)用的服務(wù)完成。如果方法不能重入,那么因無法接受所調(diào)用服務(wù)的返回消息(reply message),無法解除阻塞狀態(tài)而陷入死鎖(deadlock)。Reentrant 模式就是為了解決 Single 的這種不足,允許方法重入以完成處理過程。
Multiple: 和 Single、Reentrant 不同,Multiple 允許多個客戶端同時調(diào)用服務(wù)方法。不再有鎖的問題,同樣也不再提供同步保障(synchronization guarantees)。使用此模式時,我們必須自行使用多線程同步機制(如使用 lock 關(guān)鍵字) 來保證數(shù)據(jù)成員的讀寫安全。
使用方式如下:
- [ServiceBehavior(InstanceContextModeInstanceContextMode =
InstanceContextMode.PerSession,ConcurrencyModeConcurrencyMode=
ConcurrencyMode.Single)]- public class SessionModeService : ISessionModeAllowed
- {
- .......
- }
我們可以看出,WCF并發(fā)模型和實例模型(Instance Context Mode)是配合使用的。下面簡要的分析:
1、對實例模型為PerCall,任何并發(fā)模式都一樣的效果,因為每次客戶端的調(diào)用都是一個新的實例。
2、對實例模型為PerSession,由于服務(wù)端會保存客戶端的會話狀態(tài),如果并發(fā)模型為Single,通信方式為雙向通信(Duplex),服務(wù)端無法接受重入調(diào)用,就會產(chǎn)生死鎖。所以在實例模式為PerSession,通信方式為雙向通信(Duplex)下不能選擇WCF并發(fā)模型為Single。
3、對實例模型為Single,由于服務(wù)端有且僅有一個服務(wù)實例,通信方式為雙向通信(Duplex),同樣會產(chǎn)生死鎖。