在很多情況下我們可能都要使用非同步呼叫webservice。使用非同步的好處是非阻塞方式進行的。當然也增加一定的程式設計難度。使用非同步程式設計,我們可以實現對遠端服務的呼叫,查詢呼叫狀態,或取消呼叫等功能。
我們以**例項為例來解說
首先使用vs2k3建立乙個webservice ,假設是乙個提供**資訊的服務。這裡我處理的比較簡單,僅是模擬一下服務呼叫需要很長的時間。
namespace stockservice
#region 元件設計器生成的**
//web 服務設計器所必需的
private icontainer components = null;
///
/// 設計器支援所需的方法 - 不要使用**編輯器修改
/// 此方法的內容。
///
private void initializecomponent()
///
/// 清理所有正在使用的資源。
///
protected override void dispose( bool disposing )
base.dispose(disposing);
}#endregion
[webmethod]
public double getstockprice(string stocksymbol)
[webmethod]
public double getstockprice1(string stocksymbol)
[webmethod]
public double getstockprice2(string stocksymbol)}}
然後我們建立乙個winform程式來充當客戶端呼叫剛才建立的webservice。這裡我們有很多種方式來實現非同步呼叫(包括自己建立乙個執行緒來呼叫服務,當服務完成後,使用delegate來實現事件的**)。這種方法我們先排除掉。因為當你新增乙個web引用到本地工程時,**類裡已實現了非同步呼叫的**。
public class form2 : system.windows.forms.form
///
/// 清理所有正在使用的資源。
///
protected override void dispose( bool disposing )
}base.dispose( disposing );
}#region windows 窗體設計器生成的**
///
/// 設計器支援所需的方法 - 不要使用**編輯器修改
/// 此方法的內容。
///
private void initializecomponent()
#endregion
private void form2_load(object sender, system.eventargs e)
//你呼叫begingetstockprice()後得到乙個具有iasyncresult介面的物件。
//它提供了iscompleted的屬性。當這個值為"true"的時候,
//你就可以通過呼叫endgetstockprice()來拿到函式執行的結果。
//更重要的是,你可以在非同步呼叫的時候"放棄abort"呼叫。
//下面的程式段是用3個"按鈕(button)"來示意如何使用非同步呼叫,檢查呼叫是否結束以及放棄呼叫。
//非同步呼叫webmethod
private void button1_click(object sender, system.eventargs e)
//檢查非同步呼叫是否完成。如果完成的話,就取出呼叫結果
private void button2_click(object sender, system.eventargs e)
if(m_handle.iscompleted == false)
messagebox.text += "服務正在呼叫中" + system.environment.newline;
else
//放棄非同步呼叫
private void button3_click(object sender, system.eventargs e)
messagebox.text += "呼叫服務被使用者終止" + system.environment.newline;
//使用waithandle
//你呼叫begingetstockprice()後得到乙個具有iasyncresult介面的物件。
//它提供了asyncwaithandle的屬性。呼叫它的waitone()函式可以使程式被阻攔直到另外乙個執行緒函式呼叫完成。
//之後程式將繼續往下執行。
private void button4_click(object sender, system.eventargs e)
;//函式被阻攔,直到3個函式都執行完畢。waitany()函式情況類似,但有乙個函式完成後
//程式就解阻,繼續往下執行
waithandle.waitall(waithandles);
messagebox.text+="呼叫完成時間為:"+datetime.now.tostring()+ system.environment.newline;
double prices = new double[3];
for(int i=0;i<3;i++)
messagebox.text += "呼叫三個服務完畢:" + system.environment.newline;
}//看到現在,你可能還沒有感到滿意。因為你非同步呼叫了函式後,還要手工檢查函式是否執行完畢,
//或者要處於等待狀態。能否讓函式完成後,自動顯示結果或是做其它操作呢?
//答案是"能"的。**函式就是做這種事情的。
private void button6_click(object sender, system.eventargs e)
{if(this.m_stockservice ==null)
m_stockservice = new localhost.stockprice();
//生成**函式
asynccallback cb = new asynccallback (this.callback);
m_stockservice.begingetstockprice("ibm",cb,datetime.now);
messagebox.text += "遠端服務被呼叫" + system.environment.newline;
非同步呼叫WebService方式!
webservice方法是不需要作任何修改的,只是在呼叫時採用非同步的方式,這樣在迴圈中,速度會顯得快一點。原來的方式 new hotelmagweb.com.china sms.www.mainservices 例項化乙個物件 string ssendres sms.masssend 直接呼叫方法...
關於delphi呼叫c 寫的webservice
因為這次專案涉及到跨平台的,所採用delphi呼叫webservice 一開始的時候用delphi自動生成wsdl。呼叫hellowordl成功。非常開心,可是問題來了,helloworld是不需要傳引數,於是我就寫了乙個簡單的函式 public string returnstr string tt...
非同步呼叫Web Service的方式
webservice方法是不需要作任何修改的,只是在呼叫時採用非同步的方式,這樣在迴圈中,速度會顯得快一點。原來的方式 hotelmagweb.com.china s.www.mainservices s new hotelmagweb.com.china s.www.mainservices 例項...