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的情况下测试了循环,它按预期工作。不确定为什么在启动任务时它不起作用。
您可能在询问:
循环结束后的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
而不使用任务