当每个线程在不同的行上运行时,我面临更新 DataGridView 的问题,它总是崩溃。
这是我尝试做的示例,但老实说,我不知道如何解决它。
研究了调用方法但不起作用:(
private void threadingFunction()
{
int ThreadsNumber = dataGridView1.Rows.Count;
List<Task> tasks = new List<Task>();
for (int i = 0; i < ThreadsNumber; i++)
{
tasks.Add(Task.Factory.StartNew(() => myFunction(i)));
Thread.Sleep(1000);
}
Task.WaitAll(tasks.ToArray());
}
private void myFunction(int i)
{
doSomething()
dataGridView1[4, i].Value = "1";
doSomething();
dataGridView1[4, i].Value = "2";
doSomething();
Thread.Sleep(1000);
dataGridView1[4, i].Value = "3";
doSomething();
Thread.Sleep(1000);
dataGridView1[4, i].Value = "4";
doSomething();
Thread.Sleep(1000);
dataGridView1[4, i].Value = "5";
doSomething();
Thread.Sleep(1000);
dataGridView1[4, i].Value = "6";
}
更新
我想通了,当在同一时间 thread1 更新 datagridview,并且 thread2 在同一时间开始想要执行相同的操作或填充 datagrid 视图单元格时,它会抛出错误、“超出索引”、“对象的错误实例”等。任何人都知道如何解决这个问题,因为它使我的整个程序崩溃..并且无法弄清楚如何正确调用实现这个。
这是我正在测试的代码:
private void threadingFunction()
{
int ThreadsNumber = dataGridView1.Rows.Count;
List<Task> tasks = new List<Task>();
for (int i = 0; i < ThreadsNumber - 1; i++)
{
tasks.Add(Task.Factory.StartNew(() => myFunction(i)));
Thread.Sleep(0);
}
Task.WaitAll(tasks.ToArray());
}
private void myFunction(int i)
{
var geg = dataGridView1[4, i].Value.ToString();
dataGridView1[5, i].Value = geg;
//dataGridView1[4, i].Value = "2";
//dataGridView1[4, i].Value = "3";
//dataGridView1[4, i].Value = "4";
//dataGridView1[4, i].Value = "5";
//dataGridView1[4, i].Value = "6";
}
private void button1_Click(object sender, EventArgs e)
{
CheckForIllegalCrossThreadCalls = false;
backgroundWorker1.RunWorkerAsync();
}