日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
WCF單例服務(wù)中可擴(kuò)展性認(rèn)識(shí)

WCF開發(fā)工具的出現(xiàn),為開發(fā)人員帶來了非常大的好處。我們今天將會(huì)通過這篇文章中介紹的內(nèi)容為大家充分講解一下關(guān)于WCF單例服務(wù)的基本內(nèi)容,從而使朋友們可以加深對(duì)WCF工具的應(yīng)用。#t#

讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對(duì)這個(gè)行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡(jiǎn)單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:域名注冊(cè)雅安服務(wù)器托管、營(yíng)銷軟件、網(wǎng)站建設(shè)、博白網(wǎng)站維護(hù)、網(wǎng)站推廣。

對(duì)并發(fā)服務(wù)調(diào)用請(qǐng)求的處理是WCF最基本要求,為了提供服務(wù)的響應(yīng)能力,WCF會(huì)在不同的線程中處理并發(fā)請(qǐng)求。在單例模式下,服務(wù)實(shí)例是唯一的,也就是說相同的服務(wù)實(shí)例會(huì)同時(shí)被多個(gè)線程并發(fā)地訪問。在默認(rèn)的情況下,多個(gè)線程以同步的方式訪問WCF單例服務(wù)對(duì)象,也就是說,在某個(gè)時(shí)刻,最多只會(huì)有一個(gè)線程在使用服務(wù)實(shí)例。如果一個(gè)服務(wù)操作需要1秒,那么在一分鐘內(nèi)最多只能處理60個(gè)服務(wù)調(diào)用請(qǐng)求。倘若客戶端采用默認(rèn)的超時(shí)時(shí)限(1分鐘),對(duì)于60個(gè)并發(fā)地服務(wù)調(diào)用請(qǐng)求,至少會(huì)有一個(gè)服務(wù)調(diào)用會(huì)失敗。這極大地降低了WCF服務(wù)的可擴(kuò)展性、響應(yīng)能力和可用性。

為了讓讀者對(duì)WCF單例服務(wù)的低可擴(kuò)展性有一個(gè)深刻的認(rèn)識(shí),我寫了一個(gè)極端的案例。從這個(gè)案例演示中,讀者會(huì)清晰地認(rèn)識(shí)到提供一個(gè)相同的功能,采用單調(diào)模式和單例模式,對(duì)客戶端影響的差別有多大。本案例同樣沿用計(jì)算服務(wù)的例子,Add方法中通過使線程休眠5秒模擬一個(gè)耗時(shí)的服務(wù)操作,下面是服務(wù)的定義,采用單調(diào)實(shí)例上下文模式。

 
 
 
  1. [ServiceBehavior(InstanceContextModeInstanceContextMode = 
    InstanceContextMode.PerCall)]   
  2. public class CalculatorService : ICalculator   
  3. {   
  4. public double Add(double x, double y)   
  5. {   
  6. Thread.Sleep(5000);   
  7. return x + y;   
  8. }   

在客戶端,通過ThreadPool模擬5個(gè)并發(fā)的客戶端,在Add操作調(diào)用成功后輸出當(dāng)前的時(shí)間,從而檢驗(yàn)服務(wù)的響應(yīng)能力。

 
 
 
  1. for (int i = 0; i <   
  2. i++)   
  3. {   
  4. ThreadPool.QueueUserWorkItem(delegate   
  5. {   
  6. using (ChannelFactory channelFactory = 
    new ChannelFactory("calculatorservice"))   
  7. {   
  8. ICalculator calculator = channelFactory.CreateChannel();   
  9. Console.WriteLine("{3}: x + y = {2} when x = {0} and y = {1}", 
    1, 2, calculator.Add(1, 2), DateTime.Now); }   
  10. });   

從客戶端輸出結(jié)果我們可以看出,對(duì)于5個(gè)并發(fā)的服務(wù)調(diào)用均得到了及時(shí)的相應(yīng),這是我們希望看到的結(jié)果。

 
 
 
  1. 3/8/2009 08:03:17 : x + y = 3 when x = 1 and y = 2 
  2. 3/8/2009 08:03:17 : x + y = 3 when x = 1 and y = 2 
  3. 3/8/2009 08:03:17 : x + y = 3 when x = 1 and y = 2 
  4. 3/8/2009 08:03:18 : x + y = 3 when x = 1 and y = 2 
  5. 3/8/2009 08:03:18 : x + y = 3 when x = 1 and y = 2 

但是,如果將實(shí)例上下文模式換成是InstanceContextMode.Single,情況就完全不一樣了。從最終的輸出結(jié)果可以看出,客戶端得到執(zhí)行結(jié)果的間隔為5s,由此可知服務(wù)操作在服務(wù)端是以同步的方式執(zhí)行的。

 
 
 
  1. [ServiceBehavior(InstanceContextModeInstanceContextMode = 
    InstanceContextMode.Single)]   
  2. public class CalculatorService : ICalculator, IDisposable   
  3. {   
  4. //省略實(shí)現(xiàn)   

輸出結(jié)果:

 
 
 
  1. 3/8/2009 08:03:25 : x + y = 3 when x = 1 and y = 2 
  2. 3/8/2009 08:03:30 : x + y = 3 when x = 1 and y = 2 
  3. 3/8/2009 08:03:35 : x + y = 3 when x = 1 and y = 2 
  4. 3/8/2009 08:03:40 : x + y = 3 when x = 1 and y = 2 
  5. 3/8/2009 08:03:45 : x + y = 3 when x = 1 and y = 2 

WCF通過并發(fā)模式(Concurrency Mode)表示多線程訪問WCF單例服務(wù)對(duì)象的方式,而并發(fā)模式作為一種服務(wù)行為可以通過ServiceBehaviorAttribute特性進(jìn)行設(shè)定。WCF通過ConcurrencyMode枚舉來表示不同形式的并發(fā)模式,三個(gè)枚舉值Single、Reentrant和Multiple分別表示單線程、重入和多線程三種并發(fā)模式。關(guān)于并發(fā)和并發(fā)模式,將在本書的下一卷予以詳細(xì)講解,在這里就不再作重復(fù)介紹了。ConcurrencyMode在ServiceBehaviorAttribute的定義如下:

 
 
 
  1. [AttributeUsage(AttributeTargets.Class)]   
  2. public sealed class ServiceBehaviorAttribute : 
    Attribute, IServiceBehavior   
  3. {   
  4. //其他成員   
  5. public ConcurrencyMode ConcurrencyMode { get; set; }   
  6. }   
  7. public enum ConcurrencyMode   
  8. {   
  9. Single,   
  10. Reentrant,   
  11. Multiple   
  12. }  

ConcurrencyMode.Single是默認(rèn)采用的并發(fā)模式,這正是上面的例子中服務(wù)操作同步執(zhí)行的根本原因。為了讓服務(wù)操作異步地執(zhí)行,從未提供服務(wù)的響應(yīng)能力,我們只須要通過ServiceBehaviorAttribute將并發(fā)模式設(shè)為ConcurrencyMode.Multiple就可以了。

 
 
 
  1. [ServiceBehavior(InstanceContextModeInstanceContextMode = 
    InstanceContextMode.Single, ConcurrencyModeConcurrencyMode =
     ConcurrencyMode.Multiple)]   
  2. public class CalculatorService : ICalculator, IDisposable   
  3. {   
  4. //省略實(shí)現(xiàn)   

輸出結(jié)果:

 
 
 
  1. 3/8/2009 08:05:05 : x + y = 3 when x = 1 and y = 2 
  2. 3/8/2009 08:05:05 : x + y = 3 when x = 1 and y = 2 
  3. 3/8/2009 08:05:05 : x + y = 3 when x = 1 and y = 2 
  4. 3/8/2009 08:05:05 : x + y = 3 when x = 1 and y = 2 
  5. 3/8/2009 08:05:06 : x + y = 3 when x = 1 and y = 2 

如果將并發(fā)模式設(shè)為ConcurrencyMode.Multiple,意味著同一個(gè)服務(wù)實(shí)例在多個(gè)線程中被并發(fā)執(zhí)行。當(dāng)我們操作一些數(shù)據(jù)的時(shí)候,須要根據(jù)具體的情況考慮是否要采用一些加鎖機(jī)制來確保狀態(tài)的同步性。

WCF單例服務(wù)的基本概念就為大家介紹到這里。


本文標(biāo)題:WCF單例服務(wù)中可擴(kuò)展性認(rèn)識(shí)
當(dāng)前地址:http://www.5511xx.com/article/dhoooed.html