通常在web應用程序中不會考慮到這個需求。做智能客戶端的時候,當用到webservice時,由于服務器處理速度、網絡傳輸速度等各種原因會使一個webservice從請求開始到獲得響應結果之間等待一段時間,這時候線程會處于阻塞狀態,程序會等待請求結果導致客戶端無法進行其他的動作或處理。這時候就需要異步的使用webservice。
最容易被想到的方法當然是建立一個新的線程來執行webservice的請求并獲得結果,這樣就可以不影響程序的主線程的工作,并且也非常容易實現,但是在一個復雜的應用程序中,用戶也許會同時請求多個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));
}