首页  ·  知识 ·  云计算
ADO.NET中异步处理的方式——Wait方式
scottckt  博客园     编辑:dezai   图片来源:网络
div align=centerWait方式使用方法 三种方式中最好的一种不是Poll方
Wait方式使用方法
三种方式中最好的一种不是Poll方式,也不是回调方式,而是Wait方式。该方式提供的灵活性最大、效率最高,但有点复杂。使用这种方式,可以编写代码,启动多个异步进程,等待全部或部分进程的完成。这种方式允许只等待互相依赖的进程,然后继续执行不互相依赖的进程。按照其设计,这种方式需要仔细考虑异步进程。必须认真选择出以并行方式运行的异步进程,最重要的是,确定不同的进程如何相互依赖。这种方式的复杂性在于,需要理解其中的细节,并设计出相应的代码。最终结果一般是,非常简洁的代码设计能最大限度地利用同步和异步处理模型。

 

用代码说明。

 

在页面上放两个Gridview用于显示数据。

代码
<body>
<form id="form1" runat="server">
<div>
<asp:GridView ID="gvOrders" runat="server" AutoGenerateColumns="false">
<Columns>
<asp:BoundField HeaderText="Comany Name" DataField="CompanyName" />
<asp:BoundField HeaderText="Contact Name" DataField="ContactName" />
<asp:BoundField HeaderText="Contact Title" DataField="ContactTitle" />
<asp:BoundField HeaderText="Order Date" DataField="OrderDate" DataFormatString="{0:d}" />
</Columns>
</asp:GridView>
</div>
<br />
<div>
<asp:GridView ID="gvCustomers" runat="server">
</asp:GridView>
</div>
</form>
</body>


 

使用Wait方式取出数据

using System.Data;
using System.Data.SqlClient;
using System.Configuration;

namespace AdoAsyncDB
{
/// <summary>
/// 使用Wait方式
/// </summary>
public partial class WaitMethod : System.Web.UI.Page
{

protected void Page_Load(object sender, EventArgs e)
{
GetWaitAnyData();
}

/// <summary>
/// 使用Wait方式
/// 等待句柄关联到异步进程上。使此这种方式,可以启动需要的所有异步进程,等待全部或部分进程的完成,以便对它们执行相应的处理。
/// 使用这种方式,可以编写代码,启动多个异步进程,等待全部或部分进程的完成。这个方式允许只等待互相依赖的进程,然后继续执行不互相依赖的进程。
/// </summary>
private void GetWaitData()
{
SqlConnection DBCon;
SqlCommand Command
= new SqlCommand();
SqlDataReader OrdersReader;
IAsyncResult AsyncResult;
System.Threading.WaitHandle WHandle;

DBCon
= new SqlConnection();
DBCon.ConnectionString
= ConfigurationManager.ConnectionStrings["NorthWindDB"].ConnectionString;
Command.CommandText
= @"select top 50 Customers.CompanyName,Customers.ContactName,customers.ContactTitle,
orders.OrderID,Orders.OrderDate,Orders.RequiredDate,orders.ShippedDate
from Orders,Customers
where Orders.CustomerID=customers.CustomerID
order by customers.CompanyName,customers.ContactName
";
Command.CommandType
= CommandType.Text;
Command.Connection
= DBCon;
DBCon.Open();
AsyncResult
= Command.BeginExecuteReader();

WHandle
= AsyncResult.AsyncWaitHandle;

if (WHandle.WaitOne() == true)
{
OrdersReader
= Command.EndExecuteReader(AsyncResult);
gvOrders.DataSource
= OrdersReader;
gvOrders.DataBind();
DBCon.Close();
}
else
{
//Asynchronous process has time out.Handle this situation here.
}
}

/// <summary>
/// 使用多个等待句柄,等待全部
/// </summary>
private void GetWaitAllData()
{
SqlConnection DBCon;
SqlCommand OrdersCommand
= new SqlCommand();
SqlCommand CustCommand
= new SqlCommand();
SqlDataReader OrdersReader;
SqlDataReader CustReader;
IAsyncResult OrdersAsyncResult;
IAsyncResult CustAsyncResult;

System.Threading.WaitHandle[] WHandles
= new System.Threading.WaitHandle[2];
System.Threading.WaitHandle OrdersWHandle;
System.Threading.WaitHandle CustWHandle;


DBCon
= new SqlConnection();
DBCon.ConnectionString
= ConfigurationManager.ConnectionStrings["NorthWindDB"].ConnectionString;

CustCommand.CommandText
= "select * from customers where companyName='Alfreds Futterkiste'";
CustCommand.CommandType
= CommandType.Text;
CustCommand.Connection
= DBCon;


OrdersCommand.CommandText
= @"select top 50 Customers.CompanyName,Customers.ContactName,customers.ContactTitle,
orders.OrderID,Orders.OrderDate,Orders.RequiredDate,orders.ShippedDate
from Orders,Customers
where Orders.CustomerID=customers.CustomerID
order by customers.CompanyName,customers.ContactName
";
OrdersCommand.CommandType
= CommandType.Text;
OrdersCommand.Connection
= DBCon;

DBCon.Open();

CustAsyncResult
= CustCommand.BeginExecuteReader();
OrdersAsyncResult
= OrdersCommand.BeginExecuteReader();

CustWHandle
= CustAsyncResult.AsyncWaitHandle;
OrdersWHandle
=
OrdersAsyncResult.AsyncWaitHandle;

WHandles[
0] = CustWHandle;
WHandles[
1] = OrdersWHandle;

System.Threading.WaitHandle.WaitAll(WHandles);

CustReader
= CustCommand.EndExecuteReader(CustAsyncResult);
OrdersReader
=
OrdersCommand.EndExecuteReader(OrdersAsyncResult);

gvCustomers.DataSource
= CustReader;
gvCustomers.DataBind();

gvOrders.DataSource
= OrdersReader;
gvOrders.DataBind();

DBCon.Close();
}


/// <summary>
/// 使用多个等待句柄,等待部分
/// </summary>
private void GetWaitAnyData()
{
SqlConnection DBCon;
SqlCommand OrdersCommand
= new SqlCommand();
SqlCommand CustCommand
= new SqlCommand();
SqlDataReader OrdersReader;
SqlDataReader CustReader;
IAsyncResult OrdersAsyncResult;
IAsyncResult CustAsyncResult;

int WHindex;
System.Threading.WaitHandle[] WHandles
= new System.Threading.WaitHandle[2];
System.Threading.WaitHandle OrdersWHandle;
System.Threading.WaitHandle CustWHandle;


DBCon
= new SqlConnection();
DBCon.ConnectionString
= ConfigurationManager.ConnectionStrings["NorthWindDB"].ConnectionString;

CustCommand.CommandText
= "select * from customers where companyName='Alfreds Futterkiste'";
CustCommand.CommandType
= CommandType.Text;
CustCommand.Connection
= DBCon;


OrdersCommand.CommandText
= @"select top 5 Customers.CompanyName,Customers.ContactName,customers.ContactTitle,
orders.OrderID,Orders.OrderDate,Orders.RequiredDate,orders.ShippedDate
from Orders,Customers
where Orders.CustomerID=customers.CustomerID
order by customers.CompanyName,customers.ContactName
";
OrdersCommand.CommandType
= CommandType.Text;
OrdersCommand.Connection
= DBCon;

DBCon.Open();

CustAsyncResult
= CustCommand.BeginExecuteReader();
OrdersAsyncResult
= OrdersCommand.BeginExecuteReader();

CustWHandle
= CustAsyncResult.AsyncWaitHandle;
OrdersWHandle
= OrdersAsyncResult.AsyncWaitHandle;

WHandles[
0] = CustWHandle;
WHandles[
1] = OrdersWHandle;


for (int Index = 0; Index < 2; Index++)
{
WHindex
= System.Threading.WaitHandle.WaitAny(WHandles);
switch (WHindex)
{
case 0:
CustReader
= CustCommand.EndExecuteReader(CustAsyncResult);
gvCustomers.DataSource
= CustReader;
gvCustomers.DataBind();
break;
case 1:
OrdersReader
= OrdersCommand.EndExecuteReader(OrdersAsyncResult);
gvOrders.DataSource
= OrdersReader;
gvOrders.DataBind();
break;
default:
break
;
}
}

DBCon.Close();
}
}
}


 

 

 


 

代码下载:AdoAsyncDB.rar
 

本文作者:scottckt 来源:博客园
CIO之家 www.ciozj.com 微信公众号:imciow
    >>频道首页  >>网站首页   纠错  >>投诉
版权声明:CIO之家尊重行业规范,每篇文章都注明有明确的作者和来源;CIO之家的原创文章,请转载时务必注明文章作者和来源;
延伸阅读
也许感兴趣的
我们推荐的
主题最新
看看其它的