BeginneExecuteReaderを使ってデータを非同期的にロードします.

4360 ワード

1.Sql Command.ExecuteReader()を使用するとフォームの仮死を引き起こすので、.net 2.を追加する方法BeginnecuteReaderを使用します.
 
コードは以下の通りです
        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);
                }
            }
        }