使用BeginExecuteReader异步加载数据

private delegate void DataGridViewHandler(DataTable dt);

        /// <summary>
        /// 此处开始加在数据
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button3_Click(object sender, EventArgs e)
        {
            SqlConnection conn =
                new SqlConnection("Data Source=.;Initial Catalog=Test;User Id=sa;Password=*********;Async=true");
            conn.Open();
            SqlCommand cmd = new SqlCommand("Select top 700000 * from Test", conn) {CommandTimeout = 0};
            //此处开始查询数据,执行非常耗时的工作,ProcessData为执行完成后的委托
            cmd.BeginExecuteReader(ProcessData, cmd);
            //此处不会阻塞当前线程,label2 Text会马上执行
            label2.Text = "label2 Text会马上执行";
        }

        /// <summary>
        /// 查询完成后,执行的方法
        /// </summary>
        /// <param name="ar"></param>
        private void ProcessData(IAsyncResult ar)
        {
            SqlCommand cmd = (SqlCommand) ar.AsyncState;
            using (cmd.Connection)
            {
                using (cmd)
                {
                    SqlDataReader sdr = cmd.EndExecuteReader(ar);
                    DataTable dt = new DataTable("Product");
                    dt.Load(sdr);

                    //将查询的数据,赋给dataGridView1的DataSource
                    dataGridView1.BeginInvoke(
                        new DataGridViewHandler((dtResult) => dataGridView1.DataSource = dtResult), dt);
                }
            }
        }

知识共享许可协议
《使用BeginExecuteReader异步加载数据》常伟华 创作。
采用 知识共享 署名-相同方式共享 3.0 中国大陆 许可协议进行许可。
相邻依据:发表时间
  • 多说评论
  • 签名
  • 新浪微博
  • 默认评论
  • Tab Header 5

0 条评论 / 点击此处发表评论

Tab Content 5

开发技术


开发平台和工具

sitemap     160.30ms