protected void Page_Load(object sender, EventArgs e)
        {
            SqlConnection conn = new SqlConnection(ConnStr.Value);
            SqlCommand cmd = conn.CreateCommand();
            cmd.CommandText = "proc1"; //这个存储过程在查询分析器上需要2秒
            cmd.CommandType = CommandType.StoredProcedure;            try
            {
                conn.Open();                Response.Write("<h4>异步调用开始前-当前时间:" + DateTime.Now.ToString("hh:mm:ss fff") + "</h4>");
                Response.Write("<h5>cmd.BeginExecuteNonQuery</h5>");
                IAsyncResult ar = cmd.BeginExecuteNonQuery(acallback, null);
                Response.Write("<h4>异步调用开时后-当前时间:" + DateTime.Now.ToString("hh:mm:ss fff") + ",完成状态:" + ar.IsCompleted + "</h4>");
                Response.Write("<h5>ar.AsyncWaitHandle.WaitOne</h5>");
                ar.AsyncWaitHandle.WaitOne();
                Response.Write("<h4>异步调用等待后-当前时间:" + DateTime.Now.ToString("hh:mm:ss:fff") + ",完成状态:" + ar.IsCompleted + "</h4>");
                Response.Write("<h5>cmd.EndExecuteNonQuery</h5>");
                cmd.EndExecuteNonQuery(ar);
                Response.Write("<h4>异步调用完成后-当前时间:" + DateTime.Now.ToString("hh:mm:ss fff") + ",完成状态:" + ar.IsCompleted + "</h4>");
            }
            finally
            {
                conn.Close();
            }        }
        public void acallback(IAsyncResult ar)
        {
            Response.Write("<h3>异步回调-当前时间:" + DateTime.Now.ToString("hh:mm:ss fff") + ",完成状态:" + ar.IsCompleted + "</h3>");结果是:
异步调用开始前-当前时间:04:45:24 328 
cmd.BeginExecuteNonQuery
异步调用开时后-当前时间:04:45:24 328,完成状态:False 
ar.AsyncWaitHandle.WaitOne //<strong>为什么等待瞬间就结束了?不是说异步吗?</strong>
异步调用等待后-当前时间:04:45:24:328,完成状态:True  
cmd.EndExecuteNonQuery //<strong>为什么完成结果要这么长时间?不是说异步吗?</strong>
异步回调-当前时间:04:45:25 984,完成状态:False //<strong>为什么不是True?</strong>
异步调用完成后-当前时间:04:45:27 156,完成状态:False //<strong>为什么不是True???</strong>快来人啊~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

解决方案 »

  1.   

    这个异步是只你在开始cmd.BeginExecuteNonQuery 以后可以执行别的代码,然后IAsyncResult 这个接口来检测异步执行是否完成。给楼主我的代码:
        //异步查询的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);
                }
            }    }
    如果楼主还有什么问题可以去我的博客看一下,里面还有异步调用的其他相关代码:
    http://blog.csdn.net/oyjd614/