通常在WEB應用程序中不會考慮到這個需求做智能客戶端的時候當用到WebService時由於服務器處理速度網絡傳輸速度等各種原因會使一個WebService從請求開始到獲得響應結果之間等待一段時間這時候線程會處於阻塞狀態程序會等待請求結果導致客戶端無法進行其他的動作或處理這時候就需要異步的使用WebService
最容易被想到的方法當然是建立一個新的線程來執行WebService的請求並獲得結果這樣就可以不影響程序的主線程的工作並且也非常容易實現但是在一個復雜的應用程序中用戶也許會同時請求多個webservice這時候就得創建並控制多個線程多線程的控制雖然可以實現很好的應用程序但難度是比較大的而且很容易引起異常
的SDK中實際上就有關於異步調用webservice的介紹和示例其主要的工作原理和流程如下
方法一
private void button_Click_(object sender
System
EventArgs e)
{
//為一個Webservice的代理類創建一個實例
asy
asynchronism someWS = new asy
asynchronism();
//創建一個異步回調對象
構造函數的參數為回調的方法
該回調的方法必須包含一個異步操作狀態類型的參數
System
AsyncCallback cb= new AsyncCallback(showmsg);
//開始進行異步通信
通常定義一個IAsyncResult異步操作狀態類型的變量來接收開始異步通信方法所返回的通信狀態
//通過這個操作狀態的實例就可以掌握當前通信狀態
//如
System
IAsyncResult ar = someWS
BeginHelloWorld(cb
someWS);
someWS
BeginHelloWorld(cb
someWS);
}
void showmsg(IAsyncResult ar) //必須要有一個IAsyncResult類型的參數
{
//定義一個代理類的類型的變量接收所在回調方法的參數的異步操作信息
asy
asynchronism someWS=(asy
asynchronism)ar
AsyncState;
//該代理類實例調用End</webmethod/>方法來獲得WebService的結果
MessageBox
Show(someWS
EndHelloWorld(ar));
}
方法二
private void button_Click_(object sender
System
EventArgs e)
{
//為一個Webservice的代理類創建一個實例
asy
asynchronism someWS = new asy
asynchronism();
System
IAsyncResult ar = someWS
BeginHelloWorld(null
null);
ar
AsyncWaitHandle
WaitOne();
MessageBox
Show(someWS
EndHelloWorld(ar));
}
方法一實現了請求和接收異步通信
運用起來比較靈活
工作的方法看起來也很像多線程的操作方式
方法二雖然也實現了發送請求和接收結果異步通信
但是用在實際的程序中並沒有達到所需要的效果
詳細的介紹請參看SDK中的描述
From:http://tw.wingwit.com/Article/program/net/201311/12395.html