Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/202.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C中DataGridView中的Foreach循环、任务和DataGridViewRows#_C#_Datagridview_Foreach_Task - Fatal编程技术网

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

C# C中DataGridView中的Foreach循环、任务和DataGridViewRows#,c#,datagridview,foreach,task,C#,Datagridview,Foreach,Task,我目前正在尝试为DataGrid中的每一行启动一个新任务。我目前拥有的代码如下:- ArrayList tasks = new ArrayList(); foreach (DataGridViewRow row in tblProduct.Rows) { DataGridViewRow rowCopy = row; Task newTask = new Task(() => { checkRow(rowCopy); }); tas

我目前正在尝试为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(任务)

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();   
        }

或者,在foreach循环之后,只需使用
parallel.foreach
而不是tasks

我有
Task.WaitAll((Task[])tasks.ToArray(typeof(Task))
,问题仍然存在。因此,它们可能完成得太快了,在您看来,它们似乎从未运行过。您确定没有像您预期的那样为每一行调用
checkRow
?每次运行
checkRow
时,我都会将一个输出写入控制台。当任务不存在且正在同步运行时,它会为表中的每一行生成一个输出。但是,当它位于任务内部时,一个包含700个不同行的表只生成大约20个输出。此操作的一个输出始终是表中的最后一行。