cē非同期読取りデータベースと非同期更新uiのコード実現


非同期でデータベースを読み込むと、データバインディングの際に問題が発生します。フォームインターフェースが閉じられなくなり、タスクが終了しないとプロセスが終了しません。例えば次のコード
まず慣れ親しんだ方法で、スレッド更新UIを設定します。
a.CheckForIlle galCross ThreadCalls=false;  //a 2はフォームの名前です
下のコードはデータベースからデータを取得して結合します。

private void button1_Click(object sender, EventArgs e)
        {
            SqlConnection con;
            SqlCommand com;
            try
            {
                con = new SqlConnection("UID=sa;Password=123;Initial Catalog=AD;Data Source=192.168.1.1;Asynchronous Processing=true");
                con.Open();
                com = new SqlCommand("select top 100 * from tb_user", con);
                com.BeginExecuteReader(new AsyncCallback(delDataBin), com);
            }
            catch (Exception ex)
            {
                MessageBox.Show(" , : " + ex.Message);
            }

        }

        private void delDataBin(IAsyncResult ar)
        {
            if (ar.IsCompleted)
            {
                SqlCommand com = (SqlCommand)ar.AsyncState;
                SqlDataReader dr = com.EndExecuteReader(ar);
                DataTable dt = new DataTable();
                dt.Load(dr);
                dr.Close();

                this.dataGridView1.DataSource = dt;  //            

            }
        }

ここで完成したバインディングの作業は、実行して効果を確認します。実はこのようにフォームの仮死現象が現れます。
次はInvokeで実現します。
まず依頼を声明する  public delegate void udateDG(Datable dt);
ダタBinを通してDataGridViewを結合する。

        public void dataBin(DataTable dt)
        {
            dataGridView1.DataSource = dt;
            return;
        } 
スレッド内で以下の方法を呼び出します。

//
                if (this.InvokeRequired)
                {
                    updateDG ur = new updateDG(dataBin);
                    this.Invoke(ur, dt);
                }
完全なコードは以下の通りです。

        private void button1_Click(object sender, EventArgs e)
        {
            SqlConnection con;
            SqlCommand com;
            try
            {
                con = new SqlConnection("UID=sa;Password=123;Initial Catalog=AD;Data Source=192.168.1.1;Asynchronous Processing=true");
                con.Open();
                com = new SqlCommand("select top 100 * from tb_user", con);
                com.BeginExecuteReader(new AsyncCallback(delDataBin), com);
            }
            catch (Exception ex)
            {
                MessageBox.Show(" , : " + ex.Message);
            }

        }

        private void delDataBin(IAsyncResult ar)
        {
            if (ar.IsCompleted)
            {
                SqlCommand com = (SqlCommand)ar.AsyncState;
                SqlDataReader dr = com.EndExecuteReader(ar);
                DataTable dt = new DataTable();
                dt.Load(dr);
                dr.Close();

                //this.dataGridView1.DataSource = dt;//

                if (this.InvokeRequired)
                {
                    updateDG ur = new updateDG(dataBin);
                    this.Invoke(ur, dt);
                }
            }
        }

        public delegate void updateDG(DataTable dt);

        public void dataBin(DataTable dt)
        {
            dataGridView1.DataSource = dt;
            return;
        }           

運行を調べてみたら、結果が分かります。