我有一个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();
}
请让我摆脱痛苦,告诉我哪里出错了
感谢
答案 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)
}