概述Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM
Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM
开始一个异步过程,然后轮循检测异步过程返回的IAsyncResult对象来判断过程调用是否结束。

Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM
Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM

为异步过程提供一个回调函数。这种方法可以让你并行处理其他的任务。当异步过程结束时,回调函数被 触发用来处理过程结束后的清理工作以及通知程序的其他部分该异步过程已经结束。

Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM
Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM

第三种方法使用wait handle来处理异步过程,这是三种方法中最优雅的方法。使用这种方法你可以开启你想开启的所有异步过程,然后等待其中任何或者全部过程结束以便于做对应的处理。

Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM
Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM

Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM
Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM

轮循检测法

Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM
Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM

Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM
Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM

下面的代码用内嵌sql语句的办法取出Northwind数据库中Orders表中的前五条数据。可以通过调用BeginExecuteReader来开始一个异步过程,接下来用一个循环来等到过程结束。在等待的时候主线程会每休眠10毫秒后检测异步过程返回的结果来判断过程调用是否结束。当过程结束时用EndExecuteReader来返回结果集。

Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM
Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM

Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM
Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM

C#

Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM
Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM

<%@ Page Language=”C#” %>

Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM
Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM

<%@ Import Namespace=”System.Data” %>

Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM
Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM

<%@ Import Namespace=”System.Data.SqlClient” %>

Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM
Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM

<%@ Import Namespace=”System.Configuration” %>

Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM
Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM

<script runat=”server”>

Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM
Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM

protected void Page_Load(object sender, EventArgs e)

Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM
Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM

{

Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM
Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM

SqlConnection DBCon;

Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM
Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM

SqlCommand Command = new SqlCommand();

Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM
Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM

SqlDataReader OrdersReader;

Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM
Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM

IAsyncResult ASyncResult;

Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM
Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM

DBCon = new SqlConnection();

Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM
Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM

DBCon.ConnectionString =

Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM
Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM

ConfigurationManager.ConnectionStrings[“DSN_NorthWind”].ConnectionString;

Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM
Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM

Command.CommandText =

Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM
Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM

“SELECT TOP 5 Customers.CompanyName, Customers.ContactName, “ +

Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM
Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM

“ Orders.OrderID, Orders.OrderDate, “ +

Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM
Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM

“ Orders.RequiredDate, Orders.ShippedDate “ +

Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM
Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM

“ FROM Orders, Customers “ +

Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM
Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM

“ WHERE Orders.CustomerID = Customers.CustomerID “ +

Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM
Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM

“ ORDER BY Customers.CompanyName, Customers.ContactName “

Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM
Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM

Command.CommandType = CommandType.Text;

Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM
Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM

Command.Connection = DBCon;

Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM
Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM

DBCon.Open();

Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM
Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM

// Starting the asynchronous processing

Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM
Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM

ASyncResult = Command.BeginExecuteReader();

Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM
Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM

// This loop with keep the main thread waiting until the

Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM
Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM

// asynchronous process is finished

Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM
Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM

while (!ASyncResult.IsCompleted)

Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM
Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM

{

Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM
Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM

// Sleeping current thread for 10 milliseconds

Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM
Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM

System.Threading.Thread.Sleep(10);

Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM
Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM

}

Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM
Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM

// Retrieving result from the asynchronous process

Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM
Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM

OrdersReader = Command.EndExecuteReader(ASyncResult);

Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM
Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM

// Displaying result on the screen

Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM
Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM

gvOrders.DataSource = OrdersReader;

Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM
Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM

gvOrders.DataBind();

Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM
Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM

// Closing connection

Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM
Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM

DBCon.Close();

Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM
Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM

}

Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM
Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM

</script>Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM
Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM

Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM
如果你在while循环中打个断点,你会发现调用BeginExecuteReader方法后代码会继续执行直到异步调用结束。Ô ÅÖ6!=èÄÉwww.netcsharp.cn1zDI!”ïM