控制'dataGridView1'从其创建的线程以外的线程访问

时间:2014-07-28 13:03:06

标签: c# multithreading

我有一个Windows窗体,它将永远将数据加载到我的datagridview中。

所以我认为我使用了一个帖子,但我一直收到错误:

“跨线程操作无效:控制'dataGridView1'从其创建的线程以外的线程访问。”

这是我的代码:

private void Form1_Load(object sender, EventArgs e)
    {
       //lblFormDisplayStatus.Text = "Retrieving Data from Database";

        if (isProcessRunning)
        {
            MessageBox.Show("A process is already running.");
            return;
        }

        SetIndeterminate(true);

        Thread backgroundThread = new Thread(
            new ThreadStart(() =>
            {
                isProcessRunning = true;

                Thread.Sleep(5000);

                //MessageBox.Show("Thread completed!");                    

                BeginInvoke(new Action(() => Close()));

               RunProgram(); // the method responsible for binding the data to datagrid         

                isProcessRunning = false;
            }
        ));
        backgroundThread.Start();

        ShowDialog();           

    }

请让我摆脱痛苦,告诉我哪里出错了

感谢

1 个答案:

答案 0 :(得分:0)

UI控件是线程无关的(需要在创建控件的线程上更新)。 在您的情况下,您正在运行一个新线程,该线程正在调用一个似乎正在更新UI控件的方法(dataGridView1)。

作为快速参考:阅读Control.BeginInvoke(MSDN)。

另外,这个问题与你的问题类似: Cross-thread operation not valid: Control accessed from a thread other than the thread it was created on

编辑:更新DataGridView的方法/语句需要在UI线程上运行。像这样:

private void  RunProgram()
{
  //Do time consuming work here (non-UI thread)
   dataGridView1.BeginInvoke(new InvokeDelegate(AttachData));
}
private void AttachData()
{
   //dataGridView1.Table.... Bind data here (this method would be executed on UI thread)
}