今天學習webservice的異步調用。找了很多都是說會在用戶端生成的proxy類中會生成begin<方法名>和end<方法名>,然後在這兩個方法之間調用自己的代碼的方式實作異步操作。
但是,在用戶端的proxy類中沒有這樣的方法,相反的卻有<方法名>async的方法。這個是不是新的異步調用新的實作方式呢?于是網上找了找發現了兩篇很有價值的博文。
文中講了兩種異步調用的方法。一種是用背景線程直接調用webservice。webservice本身沒有什麼不同,就是最直接的調用。異步主要是通過背景線程(backgroundworker,僅winform中調用)實作。
文中代碼引用如下:

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 }

進度條顯示函數:

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方法名>async方法來實作異步的。
原文代碼引用如下:

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 }

另外一篇博文是馮東的,其中正好對上面講到的内容作了些補充和總結,以及在ajax方面做了些擴充叙述。
其中有一點,就是在web頁面的屬性中添加async="true",以使頁面可以調用webservice内置的異步功能。
web method代碼引用如下:

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 }

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

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 }

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

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>

作者給出的總結
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