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