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

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

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
WCF中的異步實現(xiàn)

目錄:

創(chuàng)新互聯(lián)專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于做網(wǎng)站、成都網(wǎng)站設(shè)計、西峽網(wǎng)絡(luò)推廣、重慶小程序開發(fā)、西峽網(wǎng)絡(luò)營銷、西峽企業(yè)策劃、西峽品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎;創(chuàng)新互聯(lián)為所有大學(xué)生創(chuàng)業(yè)者提供西峽建站搭建服務(wù),24小時服務(wù)熱線:028-86922220,官方網(wǎng)址:www.cdcxhl.com

1.WCF客戶端異步調(diào)用服務(wù)

2.服務(wù)端的異步實現(xiàn)

WCF客戶端異步調(diào)用服務(wù)主要通過生成異步的代理類,然后調(diào)用其中的異步方法來實現(xiàn)異步調(diào)用。

異步代理類的生成:

通過SvcUtil /async 直接生產(chǎn)異步代理;

通過添加應(yīng)用的方式,點擊”添加引用“的“高級”按鈕,在彈出來的對話框中選擇“生成異步”。如圖:

生成的異步調(diào)用代理類部分借口:

 
 
 
 
  1. [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
  2. public System.IAsyncResult BeginAdd(int x, int y, System.AsyncCallback callback, object asyncState) {
  3. return base.Channel.BeginAdd(x, y, callback, asyncState);
  4. }
  5. public void AddAsync(int x, int y) {
  6. this.AddAsync(x, y, null);
  7. }
  8. public void AddAsync(int x, int y, object userState) {
  9. if ((this.onBeginAddDelegate == null)) {
  10. this.onBeginAddDelegate = new BeginOperationDelegate(this.OnBeginAdd);
  11. }
  12. if ((this.onEndAddDelegate == null)) {
  13. this.onEndAddDelegate = new EndOperationDelegate(this.OnEndAdd);
  14. }
  15. if ((this.onAddCompletedDelegate == null)) {
  16. this.onAddCompletedDelegate = new System.Threading.SendOrPostCallback(this.OnAddCompleted);
  17. }
  18. base.InvokeAsync(this.onBeginAddDelegate, new object[] {
  19. x,
  20. y}, this.onEndAddDelegate, this.onAddCompletedDelegate, userState);
  21. }

1、客戶端異步調(diào)用服務(wù)

客戶端異步調(diào)用服務(wù)主要方式有幾種:

1.1、直接調(diào)用異步方法:

在生成的代理類中,有BeginAdd\EndAdd等服務(wù)契約中定義的Add操作的異步實現(xiàn)。直接調(diào)用BeginAdd方法,實現(xiàn)客戶端異步調(diào)用服務(wù)端方法。在調(diào)用BeginAdd方法后,可執(zhí)行一些其他操作,這些操作與服務(wù)端Add調(diào)用并行執(zhí)行,Add調(diào)用最終通過EndAdd方法得到。

測試代碼如下:

客戶端代碼:

  
 
 
 
  1. IAsyncResult asyncResult = calculatorClient.BeginAdd(1, for (int i = 0; i < 10; i++) 
  2. {
  3. Console.WriteLine(i);
  4. }
  5. int resul = calculatorClient.EndAdd(asyncResult);
  6. Console.WriteLine(string.Format("計算結(jié)果:{0}",resul));

服務(wù)端代碼:

  
 
 
 
  1. public int Add(int x, int y) 
  2. {
  3. for (int i = 0; i < 20; i++)
  4. {
  5. Console.WriteLine(i);
  6. }
  7. Console.WriteLine("開始計算...");
  8. return x + y;
  9. }

服務(wù)端輸出如下:

客戶端輸出如下:

這種方式使用了EndAdd方法,如果服務(wù)端沒有執(zhí)行完成,當(dāng)前線程會被阻塞直到異步調(diào)用的服務(wù)完成后結(jié)束。如客戶端代碼保持不變,將服務(wù)實現(xiàn)改為如下:

 
 
 
 
  1. for (int i = 0; i < 20; i++) 
  2. {
  3. Console.WriteLine(i);
  4. }
  5. Thread.Sleep(5000);
  6. Console.WriteLine("開始計算...");
  7. return x + y;

如果在服務(wù)端讓線程睡眠幾秒,就可看到客戶端會被阻塞:

1.2、通過回調(diào)的方式異步調(diào)用服務(wù):

在生成的異步調(diào)用代理類中,還可以通過回調(diào)用服務(wù):

 
 
 
 
  1. IAsyncResult asyncResult = calculatorClient.BeginAdd(1, 2,
  2. delegate(IAsyncResult asyncResult)
  3. {
  4. int [] array = asyncResult.AsyncState as int [];
  5. int result= calculatorClient.EndAdd(asyncResult1);
  6. calculatorClient.close()
  7. Console.WriteLine(string.Format("{0}+{1}={2}", array[0], array[1], result));
  8. }, new []{1,2});

這種方式是對服務(wù)的異步調(diào)用完成以后,自動調(diào)用回調(diào)來獲取結(jié)果。

1.3、通過為異步操作注冊事件

 
 
 
 
  1. //進行異步調(diào)用
  2. calculatorClient.AddAsync(10, 36, new[] { 1000 });
  3. //為異步調(diào)用完成定義觸發(fā)事件
  4. calculatorClient.AddCompleted += calculatorClient_AddCompleted;
  5. Console.WriteLine("服務(wù)調(diào)用完成...");
  6. Console.ReadKey();
  7. //異步調(diào)用完成后執(zhí)行
  8. privatestaticvoid calculatorClient_AddCompleted(object obj, AddCompletedEventArgs args)
  9. {
  10. var array = args.UserState as int[];
  11. int result = args.Result;
  12. Console.WriteLine(result);
  13. }

2、服務(wù)的異步實現(xiàn):

將服務(wù)實現(xiàn)定義成異步的方式,需要將OperationContract的AsyncPattern設(shè)置為true;應(yīng)用到BeginXX接口上,并且此操作的最后兩個參數(shù)必須為AsyncCallback ,object;需要有一個EndXX(IAsyncResult asyncResult)的接口與異步調(diào)用的接口匹配。需要注意的是EndXX(IAsyncResult asyncResult)不能再次聲明為契約接口,也就是不能再標(biāo)記為OperationContract。

將服務(wù)定義為異步服務(wù),契約定義如下 :

 
 
 
 
  1. [OperationContract(AsyncPattern = true)] 
  2. IAsyncResult BeginCalculator 
  3. (int x,int y ,AsyncCallback asyncCallback, object state);
  4. void EndCalculator(IAsyncResult);

然后在實現(xiàn)契約接口的服務(wù)中,將方法實現(xiàn)為異步的。

將契約接口聲明為單向,也就是OneWay,這樣客戶端對此服務(wù)接口調(diào)用就是異步的。因為它無需等待服務(wù)端返回,客戶端只需將消息發(fā)送到傳輸層就立即返回。

那能不能將將這種客戶端對服務(wù)端的異步調(diào)用直接標(biāo)記為單向的,那是不是可以不用生成異步代理類(即上述SvcUtil /Ayncs或者在添加引用時聲明將代理類生成異步操作)?答案是否定的,因為OneWay要求方法的返回值為void,而異步的方法需要IAsyncResult最為返回值,這兩者矛盾的。


名稱欄目:WCF中的異步實現(xiàn)
分享URL:http://www.5511xx.com/article/dhhppgs.html