<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      WCF實例與并發

      WCF中的并發針對服務而言。而服務實例封裝在InstanceContext,所以WCF中的并發最終體現在了InstanceContext中。WCF服務實例上下文模式InstanceContextMode又決定服務以何種方法為客戶端提供服務。

       

      實例模式 :

      public enum InstanceContextMode
      {
          PerSession,
          PerCall,
          Single
      }
      PerSession:每次會話都是使用同一個服務實例
      PerCall:每次調用都創建新的服務實例對象
      Single:所有服務都是用同一個服務實例對象,相當于所有客戶端代理都使用服務端同一個靜態服務實例對象為其服務
      默認情況下,InstanceContextMode默認為PerSession

       

      并發部分: 

      服務通過ServiceBehaviorAttribute的ConcurreceMode屬性定義了三種不同的并發模型:

       

      public enum ConcurrencyMode
      {
          Single,
          Reentrant,
          Multiple
      }
      Single:封裝服務實例的InstanceContext某時刻只處理一個客戶端請求,其他的請求會被放入請求隊列中等待處理。如果多個客戶端對服務并發訪問,這些服務最終在服務端也是通過串行化進行處理。如果之前的請求處理完畢,隊列中的第一個請求會被處理。它的實現是對InstanceContext繼承自CommucationObject中ThisLock
      Reentrant:該模式與Single一樣,某時刻只能處理一個客戶端請求。與Single不同的是:如果在處理 請求A時,某時刻服務端回調客戶端,此時服務可繼續處理下一個請求B。當回調客戶端完成返回服務端,如果B請求沒有處理完,則A請求需要繼續等待直至請求B釋放鎖,此時如果A能獲取到鎖,則它的請求被繼續執行。
      Multiple:在該模式下,封裝服務實例的一個InstanceContext能同時處理多個請求。
      默認情況下,ConcurrencyMode 為Single。
      下面測試一下幾種實例與并發模式
      服務契約定義:
          [ServiceContract]
          public interface IAdd
          {
              [OperationContract]
              void Add(int x, int y);
          }
      服務實現:
      public class AddService : IAdd
          {
              private readonly int counter = 0;

              public AddService()
              {
                  counter++;
                  Console.ResetColor();
                  Console.WriteLine(string.Format("AddService Construction function excute... counter is {0}", counter));
              }

              #region IAdd 成員

              public void Add(int x, int y)
              {
                  var clientId = OperationContext.Current.IncomingMessageHeaders.GetHeader<int>(MessageWrapper.headerClientId,
                                                                                                MessageWrapper.headerNamespace);
                  Console.ForegroundColor = ConsoleColor.Red;
                  Console.WriteLine(string.Format("Time:{0};ThreadId is :{1}.Request Id is {2} Add Method Invoked,", DateTime.Now,Thread.CurrentThread.ManagedThreadId,clientId));
                  Console.WriteLine(string.Format("result is : {0}",x + y));
                  Thread.Sleep(5000);
                  Console.WriteLine("=========Excute finished=========");            
                  Console.WriteLine();
              }

              #endregion
          }
      服務端配置:
             <system.serviceModel>

      <services>
                  <service name="Service.AddService">
                      <endpoint address="http://127.0.0.1:3636/AddService" binding="basicHttpBinding" contract="Contract.IAdd"></endpoint>
                  </service>
              </services>
          </system.serviceModel>

       

      客戶端配置這里不再給出。 客戶端調用代碼:

       

      ChannelFactory<IAdd> factory=new ChannelFactory<IAdd>("AddService");
      IAdd proxy = factory.CreateChannel();  

      for (int i = 0; i < 5; i++)
      {                

      ThreadPool.QueueUserWorkItem(delegate
                                          {
                                          int clientId = Interlocked.Increment(ref index);
                                              using (OperationContextScope contextScope =
                                                                   new OperationContextScope(proxy as IContextChannel))
                                              {
                                                MessageHeader<int> header = new MessageHeader<int>(clientId);
                                                      System.ServiceModel.Channels.MessageHeader messageHeader =
                                                      header.GetUntypedHeader(MessageWrapper.headerClientId,
                                                      MessageWrapper.headerNamespace);
                                                      OperationContext.Current.OutgoingMessageHeaders.Add(messageHeader);
                                                      proxy.Add(12);
                                                }
                                             });
       }

       

      測試1:PreCall + Multiple:

      輸出如下:

       

                                                                圖1 

      由以上輸出,服務對客戶端調用是以串行的方式進行的。 以上我們設置的ConcurrencyMode.Muliple。明明是并發模式,為何服務端卻以串行的方式執行呢。?這是因為如果服務代理以自動開啟的方式(即進行調用時,如果代理沒有打開,調用時會打開代理)進行并發調用,WCF需要對調用進行序列化知道代理打開之后在進行并發處理。如果將代理顯示開啟,則就能顯示并發調用結果。對代碼進行如下修改:

      IAdd proxy = factory.CreateChannel();  
      if (null != proxy as ICommunicationObject)
      {
          (proxy as ICommunicationObject).Open();
      }
      for ()
      {
       /**/ }  

      服務端輸出如下:

       

                                                                  圖2

      測試2:PerSession + Single/Reentrant

      1、將綁定協議換成支持會話的綁定,如wsHttpBinding,服務端輸出如上圖1
      2、將綁定協議換成不支持會話的綁定,如basicHttpBind個ing ,服務端輸出如上圖2
      由此可知:PerSession+Single/Reentrant下:Allowed+不支持會話的綁定,此時為服務端并發處理請求。
      Allowed +支持會話的綁定,此時為服務端串行處理請求(SessionMode不進行設置時,默認為Allowed).

      測試3: Single + Single

      將服務實例模式改為Single,即
      [ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)]
      此時服務端輸出如圖3:

       

                                                                圖3 

      由輸出可知:Single+Single/Reentrant下, 服務端串行處理請求

      測試4: Single + Multiple

      將服務實例模式改為Single,并發模式為Multiple即
      [ServiceBehavior(InstanceContextMode=InstanceContextMode.Single,ConcurrencyMode = ConcurrencyMode.Multiple)]
      此時服務端輸出如下:
                                                          圖4 

       測試5:PerCall+ Single/Reentrant/Multiple

      將服務實例模式改為PerCall,無論并發模式如何,此時中表現為并發。對WCF而言,并發是對實例上下文InstanceContext而言的。無論對于相同客戶端調用(相同服務代理)還是不同客戶端調用請求,WCF客戶端都會重新生成InstanceContext,通過封裝在其中的服務實例進行對調用的處理,因此不會存在對InstanceContext的并發調用.
      [ServiceBehavior(InstanceContextMode=InstanceContextMode.PerCall)]
      此時總為并發:此時服務端輸出如下:

                                                                 圖5

       

      由以上分析對于不同實例模式,以及并發模式總結如下圖:  

       


       

      posted @ 2012-05-23 23:23  tyb1222  閱讀(9651)  評論(8)    收藏  舉報
      主站蜘蛛池模板: 亚洲另类欧美在线电影| 与子乱对白在线播放单亲国产| 国产成人毛片在线视频| 妺妺窝人体色www聚色窝仙踪| 亚洲国产av永久精品成人| 欧美亚洲另类制服卡通动漫| 日韩伦理片| 日韩精品中文字幕人妻| 在线观看国产成人av天堂| 九九热在线视频观看这里只有精品| 免费播放一区二区三区| 国内精品久久久久影院日本| 亚洲精品无码av天堂| 亚洲人妻一区二区精品| 淅川县| 亚洲男人的天堂一区二区| 东方av四虎在线观看| 大伊香蕉精品一区视频在线| 国产精品美腿一区在线看| 国产一区日韩二区欧美三区| 国产精品成人观看视频国产奇米| 国产成人亚洲综合91精品| 欧美一本大道香蕉综合视频| 波多野结衣一区二区三区高清| 日本一区二区a√成人片| 亚洲一二区制服无码中字| 日韩深夜免费在线观看| 日夜啪啪一区二区三区| 人妻va精品va欧美va| 亚洲AV成人片不卡无码| 四虎在线中文字幕一区| 国产午夜成人久久无码一区二区| 又黄又刺激又黄又舒服| 久久99国产精品尤物| 狠狠躁夜夜躁人人爽天天5| 国产精品久久露脸蜜臀| 老王亚洲AV综合在线观看| caoporn成人免费公开| 国产精品熟女亚洲av麻豆| 毛片tv网站无套内射tv网站| 午夜精品福利亚洲国产|