使用非同步方式呼叫WebService

2022-01-17 13:35:21 字數 3219 閱讀 8128

在很多情況下我們可能都要使用非同步呼叫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 例項...