Listing12-12
Listing 12-12
Professional Asp.Net2.0 Page 448
Hi to everyone!
You will probably receive this little error that says:
Index was outside the bounds of the array.
well, I started thinking, what may cause a problem?
and has found this:
From the programming prospective usually
array starts from the [0] index and increases him self.
in this particular example we creating an Waithandle Object of the System.Threading namespace
This Waithandle object creates an Array of the 2 waithandles
WHandles[0] = CustWHandle;
WHandles[1] = OrdersWHandle;
basically
The return value from the WaitAny method is
the array index of the Wait Handle that just finsihed running.
So there's only two options available,
either Customers reader finishes first, or the other one, the Orders reader.
So basically we have a well builded
WaitHandle Array, that can contain two different values WaitHandle[1];
first value equals to 0
Second value equals to 1
//From the code of Listing 12-12
int WHIndex;
System.Threading.WaitHandle[] WHandles =
new System.Threading.WaitHandle[1];
System.Threading.WaitHandle OrdersWHandle;
System.Threading.WaitHandle CustWHandle;
However I still get this error:
Index was outside the bounds of the array
So i decided to enhance my WaitHandle Array to number 2.
new System.Threading.WaitHandle[2];
only then everything started working.
//----------------------------------------------------------------
Listing12-12
<%@ Page Language="C#" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<%@ Import Namespace="System.Configuration" %>
<script runat="server">
protected void Page_Load(object sender, EventArgs e)
{
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["DSN_NorthWind"].ConnectionString;
CustCommand.CommandText =
" SELECT * FROM Customers WHERE CompanyName = 'Alfreds Futterkiste' ";
CustCommand.CommandType = CommandType.Text;
CustCommand.Connection = DBCon;
OrdersCommand.CommandText =
" SELECT Customers.CompanyName, Customers.ContactName, " +
" Orders.OrderID, Orders.OrderDate, " +
" Orders.RequiredDate, Orders.ShippedDate " +
" FROM Orders, Customers " +
" WHERE Orders.CustomerID = Customers.CustomerID " +
" AND Customers.CompanyName = 'Alfreds Futterkiste' " +
" ORDER BY Customers.CompanyName, Customers.ContactName ";
OrdersCommand.CommandType = CommandType.Text;
OrdersCommand.Connection = DBCon;
// Opening the database connection
DBCon.Open();
// Retrieving customer information asynchronously
CustAsyncResult = CustCommand.BeginExecuteReader();
// Retrieving orders list asynchronously
OrdersASyncResult = OrdersCommand.BeginExecuteReader();
CustWHandle = CustAsyncResult.AsyncWaitHandle;
OrdersWHandle = OrdersASyncResult.AsyncWaitHandle;
// Filling Wait Handles array with the two wait handles we
// are going to use in this code
WHandles[0] = CustWHandle;
WHandles[1] = OrdersWHandle;
// Looping 2 times because there are 2 wait handles
// in the array
for (int Index = 0; Index < 2; Index++ )
{
// We are only waiting for any of the two
// asynchronous process to finish running
WHIndex = System.Threading.WaitHandle.WaitAny(WHandles);
// The return value from the WaitAny method is
// the array index of the Wait Handle that just
// finsihed running
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;
}
}
// Closing connection
DBCon.Close();
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
<title>The Wait Any Approach</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:GridView ID="gvCustomers" Width="100%" Runat="server"></asp:GridView>
<br /><br />
<asp:GridView ID="gvOrders" Width="100%" AutoGenerateColumns="False"
Runat="server">
<Columns>
<asp:BoundField HeaderText="Company Name"
DataField="CompanyName"></asp:BoundField>
<asp:BoundField HeaderText="Contact Name"
DataField="ContactName"></asp:BoundField>
<asp:BoundField HeaderText="Order Date" DataField="orderdate"
DataFormatString="{0:d}"></asp:BoundField>
<asp:BoundField HeaderText="Required Date" DataField="requireddate"
DataFormatString="{0:d}"></asp:BoundField>
<asp:BoundField HeaderText="Shipped Date" DataField="shippeddate"
DataFormatString="{0:d}"></asp:BoundField>
</Columns>
</asp:GridView>
</div>
</form>
</body>
</html>
|