ASP.NET Tutorial/ADO.net Database/IAsyncResult

Материал из .Net Framework эксперт
Версия от 14:56, 26 мая 2010; Admin (обсуждение | вклад) (1 версия)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск

The Poll approach of working with asynchronous commands (C#)

   <source lang="csharp">

<%@ 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 Command = new SqlCommand();
       SqlDataReader OrdersReader;
       IAsyncResult ASyncResult;
       DBCon = new SqlConnection();
       DBCon.ConnectionString =
         ConfigurationManager.ConnectionStrings["DSN_NorthWind"].ConnectionString;
       Command.rumandText = 
               "SELECT TOP 5 Customers.rupanyName, Customers.ContactName, " +
               " Orders.OrderID, Orders.OrderDate, " +
               " Orders.RequiredDate, Orders.ShippedDate " +
               " FROM Orders, Customers " +
               " WHERE Orders.CustomerID = Customers.CustomerID " +
               " ORDER BY Customers.rupanyName, Customers.ContactName "
       Command.rumandType = CommandType.Text;
       Command.Connection = DBCon;
       DBCon.Open();
       ASyncResult = Command.BeginExecuteReader();
       while (!ASyncResult.IsCompleted)
       {
           System.Threading.Thread.Sleep(10);
       }
       OrdersReader = Command.EndExecuteReader(ASyncResult);
       gvOrders.DataSource = OrdersReader;
       gvOrders.DataBind();
       DBCon.Close();
   }

</script> <html xmlns="http://www.w3.org/1999/xhtml" > <head id="Head1" runat="server">

   <title>The Poll Approach</title>

</head> <body>

   <form id="form1" runat="server">

   <asp:GridView ID="gvOrders" Runat="server" 
                   AutoGenerateColumns="False" Width="100%">
   <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>
   </form>

</body> </html> File: Web.config <configuration>

 <connectionStrings>
       <add name="DSN_Northwind" 
            connectionString="Data Source=localhost\SQLEXPRESS;Initial Catalog=Northwind;Integrated Security=True"
            providerName="System.Data.SqlClient" />
   </connectionStrings>

</configuration></source>


The Poll approach of working with asynchronous commands (VB)

   <source lang="csharp">

<%@ Page Language="VB" %> <%@ Import Namespace="System.Data" %> <%@ Import Namespace="System.Data.SqlClient" %> <%@ Import Namespace="System.Configuration" %> <script runat="server">

   Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) 
       Dim DBCon As SqlConnection
       Dim Command As SqlCommand = New SqlCommand()
       Dim OrdersReader As SqlDataReader
       Dim ASyncResult As IAsyncResult
       DBCon = New SqlConnection()
       DBCon.ConnectionString = ConfigurationManager.ConnectionStrings("DSN_NorthWind").ConnectionString
       Command.rumandText = "SELECT TOP 5 Customers.rupanyName, Customers.ContactName, " & _
               " Orders.OrderID, Orders.OrderDate, " & _
               " Orders.RequiredDate, Orders.ShippedDate " & _
               " FROM Orders, Customers " & _
               " WHERE Orders.CustomerID = Customers.CustomerID " & _
               " ORDER BY Customers.rupanyName, Customers.ContactName "
       Command.rumandType = CommandType.Text
       Command.Connection = DBCon
       DBCon.Open()
       ASyncResult = Command.BeginExecuteReader()
       While Not ASyncResult.IsCompleted
           System.Threading.Thread.Sleep(10)
       End While
       OrdersReader = Command.EndExecuteReader(ASyncResult)
       gvOrders.DataSource = OrdersReader
       gvOrders.DataBind()
       DBCon.Close()
   End Sub

</script> <html xmlns="http://www.w3.org/1999/xhtml" > <head id="Head1" runat="server">

   <title>The Poll Approach</title>

</head> <body>

   <form id="form1" runat="server">

   <asp:GridView ID="gvOrders" Runat="server" 
                   AutoGenerateColumns="False" Width="100%">
   <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>
   </form>

</body> </html> File: Web.config <configuration>

 <connectionStrings>
       <add name="DSN_Northwind" 
            connectionString="Data Source=localhost\SQLEXPRESS;Initial Catalog=Northwind;Integrated Security=True"
            providerName="System.Data.SqlClient" />
   </connectionStrings>

</configuration></source>


The wait approach of handling a single asynchronous process (C#)

   <source lang="csharp">

<%@ 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 Command = new SqlCommand();
       SqlDataReader OrdersReader;
       IAsyncResult ASyncResult;
       System.Threading.WaitHandle WHandle;
       DBCon = new SqlConnection();
       DBCon.ConnectionString = 
               ConfigurationManager.ConnectionStrings["DSN_NorthWind"].ConnectionString;
       Command.rumandText = "SELECT TOP 5 Customers.rupanyName, Customers.ContactName, " +
               " Orders.OrderID, Orders.OrderDate, " +
               " Orders.RequiredDate, Orders.ShippedDate " +
               " FROM Orders, Customers " +
               " WHERE Orders.CustomerID = Customers.CustomerID " +
               " ORDER BY Customers.rupanyName, Customers.ContactName ";
       Command.rumandType = 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
       {
       }
   }

</script> <html xmlns="http://www.w3.org/1999/xhtml" > <head id="Head1" runat="server">

   <title>The Wait Approach</title>

</head> <body>

   <form id="form1" runat="server">

   <asp:GridView ID="gvOrders" Runat="server" 
                   AutoGenerateColumns="False" Width="100%">
   <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>
   </form>

</body> </html> File: Web.config <configuration>

 <connectionStrings>
       <add name="DSN_Northwind" 
            connectionString="Data Source=localhost\SQLEXPRESS;Initial Catalog=Northwind;Integrated Security=True"
            providerName="System.Data.SqlClient" />
   </connectionStrings>

</configuration></source>


The wait approach of handling a single asynchronous process (VB)

   <source lang="csharp">

<%@ Page Language="VB" %> <%@ Import Namespace="System.Data" %> <%@ Import Namespace="System.Data.SqlClient" %> <%@ Import Namespace="System.Configuration" %> <script runat="server">

   Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) 
       Dim DBCon As SqlConnection
       Dim Command As SqlCommand = New SqlCommand()
       Dim OrdersReader As SqlDataReader
       Dim ASyncResult As IAsyncResult
       Dim WHandle As Threading.WaitHandle
       DBCon = New SqlConnection()
       DBCon.ConnectionString = ConfigurationManager.ConnectionStrings("DSN_NorthWind").ConnectionString
       Command.rumandText = "SELECT TOP 5 Customers.rupanyName, Customers.ContactName, " & _
               " Orders.OrderID, Orders.OrderDate, " & _
               " Orders.RequiredDate, Orders.ShippedDate " & _
               " FROM Orders, Customers " & _
               " WHERE Orders.CustomerID = Customers.CustomerID " & _
               " ORDER BY Customers.rupanyName, Customers.ContactName ";
       Command.rumandType = CommandType.Text
       Command.Connection = DBCon
       DBCon.Open()
       ASyncResult = Command.BeginExecuteReader()
       WHandle = ASyncResult.AsyncWaitHandle
       If WHandle.WaitOne = True Then
           OrdersReader = Command.EndExecuteReader(ASyncResult)
           gvOrders.DataSource = OrdersReader
           gvOrders.DataBind()
           DBCon.Close()
       Else
       End If
   End Sub

</script> <html xmlns="http://www.w3.org/1999/xhtml" > <head id="Head1" runat="server">

   <title>The Wait Approach</title>

</head> <body>

   <form id="form1" runat="server">

   <asp:GridView ID="gvOrders" Runat="server" 
                   AutoGenerateColumns="False" Width="100%">
   <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>
   </form>

</body> </html> File: Web.config <configuration>

 <connectionStrings>
       <add name="DSN_Northwind" 
            connectionString="Data Source=localhost\SQLEXPRESS;Initial Catalog=Northwind;Integrated Security=True"
            providerName="System.Data.SqlClient" />
   </connectionStrings>

</configuration></source>


Use of the WaitAny method of processing multiple asynchronous processes (C#)

   <source lang="csharp">

<%@ 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[1];
       System.Threading.WaitHandle OrdersWHandle;
       System.Threading.WaitHandle CustWHandle;
       DBCon = new SqlConnection();
       DBCon.ConnectionString = ConfigurationManager.ConnectionStrings["DSN_NorthWind"].ConnectionString;
       CustCommand.rumandText = " SELECT * FROM Customers WHERE CompanyName = "A" ";
       CustCommand.rumandType = CommandType.Text;
       CustCommand.Connection = DBCon;
       OrdersCommand.rumandText = 
               " SELECT Customers.rupanyName, Customers.ContactName, " +
               " Orders.OrderID, Orders.OrderDate, " +
               " Orders.RequiredDate, Orders.ShippedDate " +
               " FROM Orders, Customers " +
               " WHERE Orders.CustomerID = Customers.CustomerID " +
               " AND Customers.rupanyName = "Alfreds Futterkiste" " +
               " ORDER BY Customers.rupanyName, Customers.ContactName ";
       OrdersCommand.rumandType = 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;
           }
       }
       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">
   <asp:GridView ID="gvCustomers" Width="100%" Runat="server"></asp:GridView>
   

<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>
   </form>

</body> </html> File: Web.config <configuration>

 <connectionStrings>
       <add name="DSN_Northwind" 
            connectionString="Data Source=localhost\SQLEXPRESS;Initial Catalog=Northwind;Integrated Security=True"
            providerName="System.Data.SqlClient" />
   </connectionStrings>

</configuration></source>


Use of the WaitAny method of processing multiple asynchronous processes (VB)

   <source lang="csharp">

<%@ Page Language="VB" %> <%@ Import Namespace="System.Data" %> <%@ Import Namespace="System.Data.SqlClient" %> <%@ Import Namespace="System.Configuration" %> <script runat="server">

   Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) 
       Dim DBCon As SqlConnection
       Dim OrdersCommand As SqlCommand = New SqlCommand()
       Dim CustCommand As SqlCommand = New SqlCommand()
       Dim OrdersReader As SqlDataReader
       Dim CustReader As SqlDataReader
       Dim OrdersASyncResult As IAsyncResult
       Dim CustAsyncResult As IAsyncResult
       Dim WHIndex As Integer
       Dim WHandles(1) As Threading.WaitHandle
       Dim OrdersWHandle As Threading.WaitHandle
       Dim CustWHandle As Threading.WaitHandle
       DBCon = New SqlConnection()
       DBCon.ConnectionString = ConfigurationManager.ConnectionStrings("DSN_NorthWind").ConnectionString
       CustCommand.rumandText = " SELECT * FROM Customers WHERE CompanyName = "A" "
       CustCommand.rumandType = CommandType.Text
       CustCommand.Connection = DBCon
       OrdersCommand.rumandText = _
               " SELECT Customers.rupanyName, Customers.ContactName, " & _
               " Orders.OrderID, Orders.OrderDate, " & _
               " Orders.RequiredDate, Orders.ShippedDate " & _
               " FROM Orders, Customers " & _
               " WHERE Orders.CustomerID = Customers.CustomerID " & _
               " AND Customers.rupanyName = "Alfreds Futterkiste" " & _
               " ORDER BY Customers.rupanyName, Customers.ContactName "
       OrdersCommand.rumandType = 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 Index As Integer = 0 To 1
           WHIndex = Threading.WaitHandle.WaitAny(WHandles)
           Select Case WHIndex
               Case 0
                   CustReader = CustCommand.EndExecuteReader(CustAsyncResult)
                   gvCustomers.DataSource = CustReader
                   gvCustomers.DataBind()                    
               Case 1
                   OrdersReader = _
                      OrdersCommand.EndExecuteReader(OrdersASyncResult)
                   gvOrders.DataSource = OrdersReader
                   gvOrders.DataBind()
           End Select
       Next
       DBCon.Close()
   End Sub

</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">
   <asp:GridView ID="gvCustomers" Width="100%" Runat="server"></asp:GridView>
   

<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>
   </form>

</body> </html> File: Web.config <configuration>

 <connectionStrings>
       <add name="DSN_Northwind" 
            connectionString="Data Source=localhost\SQLEXPRESS;Initial Catalog=Northwind;Integrated Security=True"
            providerName="System.Data.SqlClient" />
   </connectionStrings>

</configuration></source>