<%@ 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;

        System.Threading.WaitHandle[] WHandles = new 
           System.Threading.WaitHandle[1];
        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;

        // Selecting all orders for a specific customer 
        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;

        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;

        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();
    }
</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
    <title>Wait All 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>
