0

当每个线程在不同的行上运行时,我面临更新 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();
        }
4

0 回答 0