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

Foreach loop, tasks and DataGridViewRows within a DataGridView in C#

我目前正在尝试为 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.WaitAll(tasks);after循环结束

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 而不是任务