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
而不是任务
我目前正在尝试为 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
而不是任务