生活随笔
收集整理的這篇文章主要介紹了
ADO.NET中异步处理的方式
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
以用3種不同的方式處理異步命令。一種方式是啟動異步進程,再選擇 IAsyncResult對象,看看進程何時完成。第二種方式是在開始異步進程時提供一個回調方法。這種方式可以并行執行其他任務。異步進程完成時,就觸發回調方法進行清理,并通知程序的其他部分該異步進程已完成。第三種也是最好的方法就是把一個等待句柄關聯到異步進程上,使用這種方式,可以啟動需要的所有異步進程,等待全部或部分進程的完成,以便對它們進行相應的處理。
Poll方式
view source print?
using System.Data.SqlClient;
using SYstem.Configuration;
public class SampleClass??
????protocted void Page_Load(object sender,EventArgs e)??
????????SqlConnection DBCon;??
????????SqlCommand Command = new SqlCommand();??
????????SqlDataAdapter OrderReader;??
????????IAsyncResult AsyncResult;??
????????DBCon = new SqlConnection();??
????????DBCon.ConnectionString = ConfigurationManger.ConnectionStrings["AspNetProvider"];??
????????Command.CommandText = "SELECT TOP 5 Customers.*,Orders.* FROM Orders,Customers WHERE Orders.CustomerID = Customers.CustomerID ORDER BY ustomers.CompanyName";??
????????Command.CommandType = CommandType.Text;??
????????Command.Connection = DBCon;??
????????AsyncResult = Command.BeginExecuteReader();??
????????while(!AsyncResult.IsCompleted)??
????????????System.Threading.Thread.Sleep(10);??
????????OrderReader = Command.EndExecuteReader(AsyncResult);??
????????// To do Anything You Want??
它首先調用BeginExecuteReader,啟動異步進程。之后,使用while循環等待進程的完成。在等待時,主線程全檢查異步進程的狀態,然后休眠10毫秒。進程完成后,就使用EndExecuteReader方法提取結果。
如果在while循環上設置一個斷點,就可以看到代碼在調用BeiginExecuteReader方法后會繼續執行。之后代碼繼續循環,直到異步進程完成為止。
?
Wait方式 3種方式中最好的一種不是Poll方式,也不是回調方式,而是Wait方式。該方式提供的靈活性最大、效率最高,但有點復雜。使用這種方式,可以編寫代碼,啟動多個異步進程,等待全部或部分進程的完成。這種方式允許只等待互相依賴的進程,然后繼續執行不互相依賴的進程。按照其設計,這種方式需要仔細考慮異步進程。必須認真選擇出以并行方式運行的異步進程,最重要的是,確定不同的進程如何相互依賴。這種方式的復雜性在于,需要理解其中的細節,并設計出相應的代碼。最終結果一般是,非常簡潔的代碼設計能最大限度地利用同步和異步處理模型。
view source print?
using System.Data.SqlClient;
using System.Data.Configuration;
????protected void Page_Load(object sender,EventArgs e)
????????SqlConnection DBCon;
????????SqlCommand Command = new SqlCommand();
????????SqlDataReader OrdersReader;
????????IAsyncResult AsyncResult;
????????System.Threading.WaitHandle WHandle;
????????DBCon = new SqlConnection();
????????DB.ConnectionStrings = ConfigurationManager.ConnectionStrings["AspNetProvider"];
????????Command.CommandText = "SELECT TOP 5 Customers.*,Orders.* FROM Orders,Customers WHERE Orders.CustomerID = Customers.CustomerID ORDER BY ustomers.CompanyName";
????????Command.CommandType = CommandType.Text;
????????Command.Connection = DBCon;
????????AsyncResult = Command.BeginExecuteReader();
????????WHandle = AsyncResult.AsyncWaitHandle;
????????if(WHandle.WaitOne() == true)
????????????OrdersReader = Command.EndExecuteReader(AsyncResult);
????????????DBCon.Close();
????????????// When Execute On Timeouts EventHandler
<P>如果設置一個斷點,單步執行這段代碼,程序就會在WHandle.WaitOne方法調用處停止執行。在異步進程完成后,程序會自動恢復執行。</P><P><BR><STRONG>回調方式</STRONG><BR>它首先調用BeginExecuteReader方法,給它傳送回調委托,以啟動異步進程。不需要進一步的處理,該方法在異步進程啟動后結束。觸發回調委托,以啟動異步進程。不需要進一步的處理,該方法在異步進程啟動后結束。</P>
view source print?
<PRE class=brush:csharp;gutter:false;>public class SampleClass
????protected void Page_Load(object sender,EventArgs e)
????????SqlConnection DBCon;
????????SqlCommand Command = new SqlCommand();
????????SqlDataReader OrdersReader;
????????IAsyncResult AsyncResult;
????????DBCon = new SqlConnection();
????????DB.ConnectionStrings = ConfigurationManager.ConnectionStrings["AspNetProvider"];
????????Command.CommandText = "SELECT TOP 5 Customers.*,Orders.* FROM Orders,Customers WHERE Orders.CustomerID = Customers.CustomerID ORDER BY ustomers.CompanyName";
????????Command.CommandType = CommandType.Text;
????????Command.Connection = DBCon;
????????AsyncResult = Command.BeginExecuteReader(new AsyncCallback(CBMethod),CommandBehavior.CloseConnection);
????public void CBMethod(SQLAsyncResult ar)
????????SqlDataReader OrdersReader;;
????????OrdersReader = ar.EndExecuteReader(ar);
<P>回調方式可以在代碼的另一個部分處理命令執行的結果。當命令執行的時間比較長,且需要在不待到命令執行完畢后就回應用戶時,可以使用這種方式。</P>
<P><STRONG>取消異步處理<BR></STRONG>異步進程需要的時間常常比希望的長。為了避免這個問題,可以給用戶提供一個選項來取消該進程,而不等待結果。取消異步進程只需在相應的Command對象上調用Cancel方法即可。這個方法沒有返回值。為了回退已由Command對象完成的工作,必須在執行查詢前,給Command對象提供一個定制事務。也可以自己處理回退或提交進程。</P>
轉載于:https://www.cnblogs.com/30ErLi/archive/2010/09/16/1828271.html
總結
以上是生活随笔 為你收集整理的ADO.NET中异步处理的方式 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。