WCF服務(wù)實例的并發(fā)模式是在服務(wù)實現(xiàn)類上,使用 ServiceBehaviorAttribute 的 ConcurrencyMode 屬性來指定。其值由 ConcurrencyMode 枚舉來界定,這個枚舉只有三個值:
Single——服務(wù)實例只在單個線程上運行,如果服務(wù)是單個實例,那么同一時間只有一個傳入的調(diào)用被接收,其他調(diào)用請拿票排隊。
Multiple——這個好理解,服務(wù)實例支持多個線程同時調(diào)用,所以狀態(tài)數(shù)據(jù)可能會不同步(單個服務(wù)實例),如果某些變量擔(dān)心被其他線程意外修改,可以適合地 lock 一下。
Reentrant——這家伙是今天的主角,因為它不太好理解。老周就不抄MSDN了,就按我自己的理解說一下?!翱芍厝肽J健贝笾率沁@個意思:首先,服務(wù)實例是單線程,但是,如果在服務(wù)中調(diào)用另外的服務(wù),那么此時其他正在排隊的傳入消息就可以進來。等其他另一個服務(wù)調(diào)用完成后,又重新進入當(dāng)前服務(wù)操作繼續(xù)向下執(zhí)行。有點像你去營業(yè)廳排隊辦業(yè)務(wù),服務(wù)窗口中的工作人員就是服務(wù)實例,而窗口外面排隊的客戶就是等待調(diào)用的客戶端。假如我要申請一個業(yè)務(wù),通常要填個XXX表格。要是等你填完,估計后面排隊的人會跑掉一半。所以,常規(guī)的做法是:你站到一邊去填表(相當(dāng)于在服務(wù)實例中調(diào)用另外一個服務(wù)),然后讓后面排隊的人繼續(xù)辦業(yè)務(wù)。等你填完表了,再回來找工作人員處理(相當(dāng)于另外一個服務(wù)調(diào)用完成,重新進入當(dāng)前服務(wù)實例)。
沒看懂?還是實例好用吧。來,下面咱們來動動手吧。
首先我們弄個“另一個”服務(wù)。