對於某些請求,調用WebMethod並返回結果的過程需要較長的時間,有時,不能控制從請求數據的web服務,也不能控制這些服務的性能或響應時間,因此,應該考慮異步使用web服務,發出異步請求的ASP.Net應用程序可以在其內部的SOAP請求等待響應的同時,執行其他編程任務,在ASP。NET應用程序完成其他任務後,在從WEB服務那裡獲得結果.
要異步使用Web服務,可以使用BeginXXX,EndXXX方法,其中,XXX是你的Web方法名,另外,還可以使用IsCompleted來檢查Web服務是否已經完成.這是一種方法,本文將討論在.Net2.0中異步調用Web服務的另外一種方法,當新建一個WebMethod,在客戶端引用這個Web服務後,除了可以看到這個Web方法外,還可以看到 XXXAsync,XXX Completed著兩個方法,下面就應用這兩個自動生成的方法來異步調用Web服務:
首先新建一個web服務,用於返回SQL Server2000中Pubs數據庫的authors表的全部記錄,異步調用Web服務,web服務部分不需要做任何改動,下面是c#代碼:
[WebMethod]
public DataSet BA_OperationClassGetList()
...{
string strCon = "Persist Security Info=false;Initial Catalog=pubs;User Id=sa;PassWord=;server=127.0.0.1";
string SQLString = "select * from authors";
SqlConnection connection = new SqlConnection(strCon);
DataSet ds = new DataSet();
connection.Open();
SqlDataAdapter command = new SqlDataAdapter(SQLString, connection);
command.Fill(ds, "ds");
return ds;
}
下面我將講解怎麼在客戶端異步調用這個web服務,(以Winfom為例),首先添加該Web服務的引用,下面是客戶端全部源代碼:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace WindowsApplication1
...{
public partial class Form1 : Form
...{
private localhost.WebService service;
public Form1()
...{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
...{
//開始異步調用
service.BA_OperationClassGetListAsync();
}
private void service_BA_OperationClassGetListCompleted(object sender, localhost.BA_OperationClassGetListCompletedEventArgs e)
...{
DataSet ds = (DataSet)e.Result;
dataGridVIEw1.DataSource = ds.Tables[0];
}
private void Form1_Load(object sender, EventArgs e)
...{
service = new WindowsApplication1.localhost.WebService();
service.BA_OperationClassGetListCompleted += new WindowsApplication1.localhost.BA_OperationClassGetListCompletedEventHandler(service_BA_OperationClassGetListCompleted);
}
}
}
至此,這個異步使用web服務的代碼已經書寫完畢,我們就可以在等待這個web響應的同時可以顯示一個滾動條或者提供一個取消按鈕,可以隨時終止WEB響應.