ADO.NET2.0异步查询方法学习

public  string ConStr = ConfigurationManager.ConnectionStrings["NorthwindConnectionString"].ConnectionString;
    protected void Page_Load(object sender, EventArgs e)
    ...{
        if (!IsPostBack)
        ...{
            BindData();
            //BindMultiData();
            //BindMultiDataArray();
            //BindDataWithCallBack();
        }
       
    }

    //异步查询的poll方式,最普通的方式
    private void BindData()
    ...{
        string QueryStr = "SELECT * FROM customers";
        using (SqlConnection Con = new SqlConnection(ConStr))
        ...{
            SqlCommand Cmd = new SqlCommand(QueryStr, Con);
            IAsyncResult ASynResult;
            SqlDataReader Da;
            try
            ...{
                Con.Open();
                //begin方法返回一个IAsyncResult对象,用来检查执行是否完成
                ASynResult = Cmd.BeginExecuteReader(CommandBehavior.CloseConnection);
                while (!ASynResult.IsCompleted)
                ...{
                    Response.Write("异步查询</br>");
                    ASynResult.AsyncWaitHandle.WaitOne(3000, true);
                    //System.Threading.Thread.Sleep(10);
                }
                Da = Cmd.EndExecuteReader(ASynResult);
                GridView1.DataSource = Da;
                GridView1.DataBind();
            }
            catch (Exception ex)
            ...{
                Response.Write(ex.Message);
            }
        }

    }


    //异步查询的wait方式,使用多个等待句柄来异步查询,必须等待所有进程完成处理结果集
    private void BindMultiData()
    ...{
        string CusQueryStr = "SELECT * FROM customers WHERE CompanyName = 'Alfreds Futterkiste'";
        string SupQueryStr = "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";
        using (SqlConnection MyCon = new SqlConnection(ConStr))
        ...{
            SqlCommand CusCmd = new SqlCommand(CusQueryStr, MyCon);
            SqlCommand SupCmd = new SqlCommand(SupQueryStr, MyCon);
            SqlDataReader CusDr;
            SqlDataReader SupDr;
            IAsyncResult CusIsynResult;
            IAsyncResult SupIsynResult;
            //创建句柄数组
            System.Threading.WaitHandle[] WHandles = new System.Threading.WaitHandle[2];
            System.Threading.WaitHandle CusHandle;
            System.Threading.WaitHandle SupHandle;

            MyCon.Open();

            CusIsynResult = CusCmd.BeginExecuteReader(CommandBehavior.CloseConnection);
            SupIsynResult = SupCmd.BeginExecuteReader(CommandBehavior.CloseConnection);

            CusHandle = CusIsynResult.AsyncWaitHandle;
            SupHandle = SupIsynResult.AsyncWaitHandle;

            //将等待句柄赋给句柄数组
            WHandles[0] = CusHandle;
            WHandles[1] = SupHandle;
            //将数组传给waitall方法,等待所以的异步查询完成
            System.Threading.WaitHandle.WaitAll(WHandles);

            CusDr = CusCmd.EndExecuteReader(CusIsynResult);
            SupDr = SupCmd.EndExecuteReader(SupIsynResult);

            GridView1.DataSource = CusDr;
            GridView1.DataBind();

            GridView2.DataSource = SupDr;
            GridView2.DataBind();

            MyCon.Dispose();
            CusCmd.Dispose();
            SupCmd.Dispose();
        }

 

        
    }

    //采用WaitAny方式,优点是不用等待所有进程都完成才处理结果集
    private void BindMultiDataArray()
    ...{
        string CusQueryStr = "SELECT * FROM customers WHERE CompanyName = 'Alfreds Futterkiste'";
        string SupQueryStr = "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";
       using (SqlConnection MyCon = new SqlConnection(ConStr))
        ...{
            SqlCommand CusCmd = new SqlCommand(CusQueryStr, MyCon);
            SqlCommand SupCmd = new SqlCommand(SupQueryStr, MyCon);
            SqlDataReader CusDr;
            SqlDataReader SupDr;
            IAsyncResult CusIsynResult;
            IAsyncResult SupIsynResult;
            System.Threading.WaitHandle[] WHandles = new System.Threading.WaitHandle[2];
            System.Threading.WaitHandle CusHandle;
            System.Threading.WaitHandle SupHandle;
            int WHindex;

            MyCon.Open();

            CusIsynResult = CusCmd.BeginExecuteReader(CommandBehavior.CloseConnection);
            SupIsynResult = SupCmd.BeginExecuteReader(CommandBehavior.CloseConnection);

            CusHandle = CusIsynResult.AsyncWaitHandle;
            SupHandle = SupIsynResult.AsyncWaitHandle;

            WHandles[0] = CusHandle;
            WHandles[1] = SupHandle;

            for (int i = 0; i < WHandles.Length; i++)
            ...{
                //waitany好处在于不必等待所有异步操作完成
                WHindex = System.Threading.WaitHandle.WaitAny(WHandles);
                switch (WHindex)
                ...{
                    case 0:
                        CusDr = CusCmd.EndExecuteReader(CusIsynResult);
                        GridView1.DataSource = CusDr;
                        GridView1.DataBind();
                        break;

                    case 1:
                        SupDr = SupCmd.EndExecuteReader(SupIsynResult);
                        GridView2.DataSource = SupDr;
                        GridView2.DataBind();
                        break;
                }
            }

            MyCon.Dispose();
            CusCmd.Dispose();
            SupCmd.Dispose();
        }

 

    }

    //通过回调来实现异步查询
    private void BindDataWithCallBack()
    ...{
        string SupQueryStr = "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";
        using (SqlConnection MyCon = new SqlConnection(ConStr))
        ...{
            SqlCommand SupCmd = new SqlCommand(SupQueryStr, MyCon);
            SqlDataReader SupDr;
            IAsyncResult SupIsynResult;
            MyCon.Open();

            AsyncCallback Callback = new AsyncCallback(CallBackMethod);
            SupIsynResult = SupCmd.BeginExecuteReader(Callback, SupCmd,CommandBehavior.CloseConnection);
            System.Threading.Thread.Sleep(100);

            MyCon.Dispose();
            SupCmd.Dispose();
        }


    }

    //回调方法
    public void CallBackMethod(IAsyncResult IResult)
    ...{
        SqlCommand Command = (SqlCommand)IResult.AsyncState;
        SqlDataReader dr = Command.EndExecuteReader(IResult);
        GridView1.DataSource = dr;
        GridView1.DataBind();
    }
}
本文来自: 中国自学编程网(www.zxbc.cn) 详细出处参考:http://www.zxbc.cn/html/adonet/1713241149778_2.html
永不言败:高级程序员,网站架构师。从事软件开发多年,,承接B/S架构相关项目。有意者请联系QQ:20028205

posted @ 2008-03-01 13:44  永不言败  阅读(819)  评论(1编辑  收藏  举报