天天看點

異步調用webservice

     今天學習webservice的異步調用。找了很多都是說會在用戶端生成的proxy類中會生成begin<方法名>和end<方法名>,然後在這兩個方法之間調用自己的代碼的方式實作異步操作。

  但是,在用戶端的proxy類中沒有這樣的方法,相反的卻有<方法名>async的方法。這個是不是新的異步調用新的實作方式呢?于是網上找了找發現了兩篇很有價值的博文。

     文中講了兩種異步調用的方法。一種是用背景線程直接調用webservice。webservice本身沒有什麼不同,就是最直接的調用。異步主要是通過背景線程(backgroundworker,僅winform中調用)實作。

  文中代碼引用如下:

異步調用webservice

 1  private void button1_click(object sender, eventargs e)  

 2  {  

 3      backgroundworker backgroundworker = new backgroundworker();  

 4      //注冊具體異步處理的方法  

 5      backgroundworker.dowork += new doworkeventhandler(back_dowork);  

 6      //注冊調用完成後的回調方法  

 7      backgroundworker.runworkercompleted +=   

 8          new runworkercompletedeventhandler(back_runworkercompleted);  

 9      //這裡開始異步調用  

10      backgroundworker.runworkerasync();  

11      //調用服務的同時用戶端處理并不停止  

12      changeprocessbar();   

13  }  

14  //完成事件  

15  void back_runworkercompleted(object sender, runworkercompletedeventargs e)  

16  {  

17      if (e.error != null)  

18          throw e.error;  

19      progressbar1.value = progressbar1.maximum; //調用完成了,把用戶端進度條填充滿  

20      string price = e.result.tostring();   //擷取處理結果  

21      messagebox.show("調用完成。價格是:" + price); //顯示從伺服器擷取的結果值  

22  }  

23  //調用方法  

24  void back_dowork(object sender, doworkeventargs e)  

25  {  

26      //web service代理類  

27      productservice.ltpservice service = new productservice.ltpservice();  

28      //調用web方法getclass1,将結果指派給doworkeventargs的result對象  

29      e.result = service.getproductprice("001");   

30  } 

異步調用webservice

進度條顯示函數:

異步調用webservice

 1 //<summary>  

 2 //界面的進度條顯示  

 3 //</summary>  

 4 void changeprocessbar()  

 5 {  

 6     for (int i = 0; i < 10; i++)  

 7     {  

 8         progressbar1.value = i;  

 9         system.threading.thread.sleep(500);  

10     }  

11 } 

異步調用webservice

  第二種異步調用的方法是調用webservice内置的異步調用方式。這裡主要就要調用<webservice方法名>async方法來實作異步的。

  原文代碼引用如下:

異步調用webservice

 1 private void button2_click(object sender, eventargs e)  

 2 {  

 3     //web service代理類  

 4     productservice.ltpservice service = new productservice.ltpservice();  

 5     //這裡開始異步調用  

 6     service.getproductpriceasync("001");   

 7     //注冊調用完成後的回調方法  

 8     service.getproductpricecompleted += new productservice.  

 9         getproductpricecompletedeventhandler(getproductpricecompleted);  

10     //調用同時用戶端處理不停止    

11     changeprocessbar();  

12 }  

13 //完成事件處理方法  

14 void getproductpricecompleted(object sender, productservice.  

15             getproductpricecompletedeventargs e)  

16 {  

17     if (e.error != null)  

18         throw e.error;  

19     progressbar1.value = progressbar1.maximum;  //調用完成了,把用戶端進度條填充滿  

20     string price = e.result.tostring();         //擷取處理結果  

21     messagebox.show("調用完成。價格是:" + price);   //顯示從伺服器擷取的結果值  

22 } 

異步調用webservice

      另外一篇博文是馮東的,其中正好對上面講到的内容作了些補充和總結,以及在ajax方面做了些擴充叙述。

  其中有一點,就是在web頁面的屬性中添加async="true",以使頁面可以調用webservice内置的異步功能。

  web method代碼引用如下:

異步調用webservice

1    [webmethod]

2    public dll.employeesdatatable getemployee()

3    {

4       dll.employeesdatatable result = new dll.employeesdatatable();

5       dlltableadapters.employeestableadapter eta = new webserviceasyn.dlltableadapters.employeestableadapter();

6       eta.fillemployee(result);

7       return result;

8    }

異步調用webservice

  用戶端調用代碼引用如下:

異步調用webservice

 1 /實體化webservice引用

 2 private asynwebservice.service1 asynser;

 3 //構造函數初始化 webservice引用,并為異步調用webservice設定好了結果處理函數【方法名completed】(先這麼叫吧,我也不知道怎麼叫)

 4 public _default()

 5 {

 6     asynser = new asynwebservice.service1();

 7     asynser.helloworldcompleted += new asynwebservice.helloworldcompletedeventhandler(asynser_helloworldcompleted);

 8     asynser.getemployeecompleted += new asynwebservice.getemployeecompletedeventhandler(asynser_getemployeecompleted);

 9 }

10 protected void button1_click(object sender, eventargs e)

11 {

12     //開始異步調用helloworld;

13     asynser.helloworldasync();

14 }

15 

16 protected void asynser_helloworldcompleted(object sender, asynwebservice.helloworldcompletedeventargs e)

17 {

18     this.label1.text = e.result.tostring();

19 }

20 

21 protected void asynser_getemployeecompleted(object sender, asynwebservice.getemployeecompletedeventargs e)

22 {

23     this.gridview1.datasource = e.result;

24     this.gridview1.databind();

25 }

26 protected void button2_click(object sender, eventargs e)

27 {

28     //開始異步調用getemployee

29     asynser.getemployeeasync();

30 }

異步調用webservice

   下面是作者給出的ajax的異步調用和作者對這兩種異步調用方式的總結:

異步調用webservice

 1 <script language="javascript" type="text/javascript">

 2     var xmlhttp;

 3     function createxmlhttprequest()

 4     {

 5     if(window.activexobject)

 6     {

 7        xmlhttp = new activexobject("microsoft.xmlhttp");

 8     }

 9     else if(window.xmlhttprequest)

10     {

11        xmlhttp = new xmlhttprequest();

12     }        

13    }

14     

15     function requeststart()

16     {

17         if(document.getelementbyid("tbx1").value.length <= 4)

18         {

19             alert("使用者名的長度要求大于4個字元!");

20             return false;

21         }

22         document.getelementbyid("sp1").innertext = "loding";

23         var url = "default.aspx?username=" + document.getelementbyid("tbx1").value;

24     createxmlhttprequest();//建立xmlhttprequest對象

25     xmlhttp.onreadystatechange = callback;//為xmlhttprequest對象指定結果處理函數

26     xmlhttp.open("get",url);//打開連結

27     xmlhttp.send(null);//發送請求

28     }

29     //結果處理函數                

30     function callback()

31     {

32     if(xmlhttp.readystate == 4)

33     {

34        document.getelementbyid("sp1").innertext = xmlhttp.responsetext;

35     }

36     }        

37 </script>

異步調用webservice

  作者給出的總結

  1:ajax需要建立xmlhttprequest對象,asp.net需要實體化webservice代理類對象

2:xmlhttprequest 對象需要指定結果處理函數,asp.net也需要指定結果處理函數

3:xmlhttprequest的結果處理函數必須在請求發送之前設定,asp.net同樣也是需要在              方法被調用之前設定好結果處理函數

      作者還提到了一些flex中的異步調用webservice的知識,用興趣的同學可以到作者的原文中檢視。

引用博文:

<a href="http://book.51cto.com/art/200906/129768.htm" target="_blank">http://book.51cto.com/art/200906/129768.htm</a>

<a href="http://www.cnblogs.com/interboy/archive/2007/04/06/702594.html" target="_blank">http://www.cnblogs.com/interboy/archive/2007/04/06/702594.html</a>

歡迎加群互相學習,共同進步。qq群:ios: 58099570 | android: 330987132 | go:217696290 | python:336880185 | 做人要厚道,轉載請注明出處!http://www.cnblogs.com/sunshine-anycall/archive/2010/04/30/1724595.html

繼續閱讀