異步調用Web Service就是避免客戶端在調用耗時間的服務方法的時候出現假死狀態。那麼怎麼異步調用呢?
微軟的 System.ComponentModel.BackgroundWorker 類可以解決此類問題
(1)註冊bw.DoWork += new DoWorkEventHandler(bw_DoWork); 在 private void bw_DoWork(object sender, DoWorkEventArgs e)方法中調用Web服務;
(2) 註冊bw.RunWorkerCompleted +=new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);在private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)方法中針對調用後的結果做調用結束後的操作。
(3)bw.RunWorkerAsync();語句是開始異步調用。
(1)和(2)中的調用結果通過e.Result傳遞。在bw_RunWorkerCompleted中將調用服務返回的結果e.Result進行AS映射回所需的類型。例如:ServiceReference1.MClass m = new ServiceReference1.MClass();
m = e.Result as ServiceReference1.MClass;
還有一種方法是使用條件Web引用時候生成的客戶端代理類,注意是添加Web引用,不是添加服務引用,在VS2008後續版本中添加Web引用可以點擊添加服務引用的選項頁面的“高級”按鈕。如下圖:
protected void Button1_Click(object sender, EventArgs e)
{
T_WebApplication.localhost.Service1 s = new T_WebApplication.localhost.Service1();
s.GetClass1Completed += new T_WebApplication.localhost.GetClass1CompletedEventHandler(s_GetClass1Completed);
s.GetClass1Async();
}
public void s_GetClass1Completed(object sender, T_WebApplication.localhost.GetClass1CompletedEventArgs e)
{
if (e.Error != null)
{
throw e.Error;
}
else
{
T_WebApplication.localhost.MClass m = e.Result as T_WebApplication.localhost.MClass;
Response.Write(m.ID + m.Name);
}
}