web|教程|非同步
通常在WEB應用程式中不會考慮到這個需求。做智能用戶端的時候,當用到WebService時,由於伺服器處理速度、網路傳輸速度等各種原因會使一個WebService從請求開始到獲得響應結果之間等待一段時間,這時候線程會處於阻塞狀態,程式會等待請求結果導致用戶端無法進行其他的動作或處理。這時候就需要非同步使用WebService。
最容易被想到的方法當然是建立一個新的線程來執行WebService的請求並獲得結果,這樣就可以不影響程式的主線程的工作,並且也非常容易實現,但是在一個複雜的應用程式中,使用者也許會同時請求多個webservice,這時候就得建立並控制多個線程。多線程的控制雖然可以實現很好的應用程式,但難度是比較大的,而且很容易引起異常。
在.net的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中的描述