C# C中DataGridView中的Foreach循环、任务和DataGridViewRows#
我目前正在尝试为DataGrid中的每一行启动一个新任务。我目前拥有的代码如下:-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
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个输出。此操作的一个输出始终是表中的最后一行。