大佬帮忙看一下,是什么原因造成的,不能这么写吗,我是一个新手,不是很懂
Task.Run是异步的,由于没有加await等待,里面的代码没来得及执行就循环到了 i == list.Count,然后每个task都用的同一个变量i,最终将是6个读取list[6]的task。可以加await(异步等待),或者用一个临时变量在循环中代替i(每个task用上独有的变量)
谢谢,明白了
@小科技: 当时回答错了,更深的原因是C#的闭包。一般而言,循环共用同一个闭包变量。而加了await之后,会有异步等待(在每次循环迭代时,await 关键字会将闭包中的值捕获并传递给异步操作。这样,每个异步操作都会使用独立的闭包实例);而如果用临时变量,也是相当于每次产生新的闭包。
for (int i = 0; i < list.Count; i++)
{
int j = i;// 在循环内定义变量接收i,保证每个任务都是独立变量
Task.Run(() =>
{
Invoke(new Action(() =>
{
Console.WriteLine(list[j]);//输出每个任务对应的值
}));
});
}
谢谢,明白了