普通調用Web Service的方法在Web Service執行期間客戶端會一直等待服務執行完畢才能響應從而造成客戶端UI線程的阻塞假死現象這時候異步調用就顯得很有用它可以讓客戶端在調用Web Service時不至於阻塞客戶端的UI線程導致假死還可以在調用Web Service的同時做些其他的處理異步調用Web Service也有幾種不同的方法這裡介紹常用的兩種
第一種方法是通過利用Backgroundworker對象實現 BackgroundWorker 類允許你在單獨的專用線程上運行操作耗時的操作(如下載和數據庫事務)在長時間運行時可能會導致用戶界面(UI)似乎處於停止響應狀態如果你需要能進行響應的用戶界面而且面臨與這類操作相關的長時間延遲則可以使用 BackgroundWorker 類方便地解決問題
private void button_Click(object sender EventArgs e)
{
BackgroundWorker backgroundworker = new BackgroundWorker();
//注冊具體異步處理的方法
backgroundworkerDoWork += new DoWorkEventHandler(back_DoWork);
//注冊調用完成後的回調方法
backgroundworkerRunWorkerCompleted +=
new RunWorkerCompletedEventHandler(back_RunWorkerCompleted);
//這裡開始異步調用
backgroundworkerRunWorkerAsync();
//調用服務的同時客戶端處理並不停止
ChangeProcessBar();
}
//完成事件
void back_RunWorkerCompleted(object sender RunWorkerCompletedEventArgs e)
{
if (eError != null)
throw eError;
progressBarValue = progressBarMaximum; //調用完成了把客戶端進度條填充滿
string price = eResultToString(); //獲取處理結果
MessageBoxShow(調用完成價格是 + price); //顯示從服務器獲取的結果值
}
//調用方法
void back_DoWork(object sender DoWorkEventArgs e)
{
//Web Service代理類
ProductServiceLTPService service = new ProductServiceLTPService();
//調用Web方法GetClass將結果賦值給DoWorkEventArgs的Result對象
eResult = serviceGetProductPrice();
}
其中ChangeProcessBar()方法是處理進度條控制顯示的代碼用於代表其他的操作
//<summary>
//界面的進度條顯示
//</summary>
void ChangeProcessBar()
{
for (int i = ; i < ; i++)
{
progressBarValue = i;
SystemThreadingThreadSleep();
}
}
第二種方法是調用Web Service的WebMethod中的Async方法實現當添加完Web Service的引用以後會在本地生成代理類其中會有一個和原Web Service方法名字相同而後綴是Async的方法
private void button_Click(object sender EventArgs e)
{
//Web Service代理類
ProductServiceLTPService service = new ProductServiceLTPService();
//這裡開始異步調用
serviceGetProductPriceAsync();
//注冊調用完成後的回調方法
serviceGetProductPriceCompleted += new ProductService
GetProductPriceCompletedEventHandler(GetProductPriceCompleted);
//調用同時客戶端處理不停止
ChangeProcessBar();
}
//完成事件處理方法
void GetProductPriceCompleted(object sender ProductService
GetProductPriceCompletedEventArgs e)
{
if (eError != null)
throw eError;
progressBarValue = progressBarMaximum; //調用完成了把客戶端進度條填充滿
string price = eResultToString(); //獲取處理結果
MessageBoxShow(調用完成價格是 + price); //顯示從服務器獲取的結果值
}
From:http://tw.wingwit.com/Article/program/net/201311/13918.html