C#中DataGridView中的Foreach循环、任务和DataGridViewRows

本文关键字:任务 DataGridViewRows 循环 Foreach DataGridView 中的 | 更新日期: 2023-09-27 18:24:07

我目前正试图为DataGrid中的每一行启动一个新任务。我目前拥有的代码如下:-

ArrayList tasks = new ArrayList();
foreach (DataGridViewRow row in tblProduct.Rows)
{
    DataGridViewRow rowCopy = row;
    Task newTask = new Task(() =>
    {
        checkRow(rowCopy);
    });
    tasks.Add(newTask);
    newTask.Start();   
}

问题是,它跳到最后,在完成每一行之前就停止了。可以做些什么来允许每行运行一个任务?

编辑

在没有Task的情况下测试了循环,它按预期工作。不确定为什么在启动任务时它不起作用。

C#中DataGridView中的Foreach循环、任务和DataGridViewRows

您可能在询问:

循环结束后的Task.WaitAll(tasks);

foreach (DataGridViewRow row in tblProduct.Rows)
{
    ...
    tasks.Add(newTask);
    ..   
}
Task.WaitAll(tasks);

我不确定这个问题是否得到了正确的回答,但对于未来的读者来说,这里的问题是checkRow在任务可以做任何事情之前就已经更新了,那么,checkRow的最后一个值就是任务真正使用的值。为了避免这种情况,不要对所有任务使用相同的变量,而是像这样调用那些不共享的变量:

ArrayList tasks = new ArrayList();
    foreach (DataGridViewRow row in tblProduct.Rows)
        {
            Task newTask = new Task(() =>
            {
                DataGridViewRow rowCopy = row;
                checkRow(rowCopy);
            });
            tasks.Add(newTask);
            newTask.Start();   
        }

或者,只使用parallel.foreach而不使用任务