在上一章介紹過非同步IHttpHandler後,大家應該瞭解到非同步作業帶來的好處。它可以及時釋放伺服器線程池裡面的線程,當完成外部操作再使用回呼函數進行資料擷取。
下面為大家介紹一下非同步Web Service的操作,其實它與非同步IHttpHandler的原理是十分相似的,記得在介紹IHttpHandler裡面以Stream非同步作為例子,下面以SqlCommand作為例子。(還說一句老話,我這裡指的是伺服器端的非同步方式,而並非用戶端非同步呼叫)
[ISerializable]
public class User{....}
public class Service1:System.Web.Service.WebSerivce
{
//系統會自動識別BeginMethod(參數,AsyncCallback,object),EndMethod(IAsyncResult)方法
//並把它作為非同步方法呼叫處理
[WebMethod]
public IAsyncResult BeginGetList(int age, AsyncCallback cb, object o)
{
SqlConnection conn = new SqlConnection("Data Source=...;...;Asynchronous Processing=true");
string commandString="Select * From User as t1 Where t1.age>"+age.ToString();
SqlCommand command = new SqlCommand(commandString, conn);
conn.Open();
return this.m_cmd.BeginExecuteRead(cb, command);
//此時,伺服器的線程會被釋放,等待Command完成時Callback喚醒
}
[WebMethod]
public List<User> EndGetList(IAsyncResult result)
{
Sqlcommand command=(SqlCommand) result.AsyncState;
SqlDataRead read=command.EndExecuteRead(result);
............ //資料轉換
return users;
}
}
在用戶端調用的時候,由於資訊是通過SOAP方便傳遞,系統可以自動識別GetList(int age)方法。你也可以在用戶端使用非同步呼叫的方式,來調用WebService,這樣可以使系統配合得更完美。
可惜的是,微軟還沒有一個完美的非同步ADO.NET調用機制;而只是將 SQL 調用封裝到非同步委託調用中對提高效率沒有什麼協助。
個人建議可以嘗試使用 Microsoft SQL Server Web Services Toolkit將您的資料庫發布為 Web 服務。
總結:
ASP.NET Web 服務中提供了一個有效機制,可以非同步呼叫後端服務,使線程池中的寶貴線程及時得到釋放。通過結合對後端資源的非同步請求,伺服器可以使用自己的 Web 方法使同時處理的請求數目達到最大。您應該考慮使用此方法開發高效能的 Web 服務應用程式。
ASP.NET伺服器端多線程設計——非同步Web服務
ASP.NET伺服器端多線程設計——非同步IHttpHandler