首页 新闻 会员 周边 捐助

第一次发帖,大佬帮忙看一下什么问题

0
悬赏园豆:5 [已解决问题] 解决于 2022-11-21 10:45


大佬帮忙看一下,是什么原因造成的,不能这么写吗,我是一个新手,不是很懂

小科技的主页 小科技 | 初学一级 | 园豆:197
提问于:2022-11-21 01:01
< >
分享
最佳答案
1

Task.Run是异步的,由于没有加await等待,里面的代码没来得及执行就循环到了 i == list.Count,然后每个task都用的同一个变量i,最终将是6个读取list[6]的task。可以加await(异步等待),或者用一个临时变量在循环中代替i(每个task用上独有的变量)

收获园豆:4
复制粘贴机器人 | 小虾三级 |园豆:720 | 2022-11-21 09:08

谢谢,明白了

小科技 | 园豆:197 (初学一级) | 2022-11-21 10:43

@小科技: 当时回答错了,更深的原因是C#的闭包。一般而言,循环共用同一个闭包变量。而加了await之后,会有异步等待(在每次循环迭代时,await 关键字会将闭包中的值捕获并传递给异步操作。这样,每个异步操作都会使用独立的闭包实例);而如果用临时变量,也是相当于每次产生新的闭包。

复制粘贴机器人 | 园豆:720 (小虾三级) | 2023-07-17 17:11
其他回答(1)
0
for (int i = 0; i < list.Count; i++)
{
    int j = i;// 在循环内定义变量接收i,保证每个任务都是独立变量
    Task.Run(() =>
    {
        Invoke(new Action(() =>
        {
            Console.WriteLine(list[j]);//输出每个任务对应的值
        }));
    });
}
收获园豆:1
三人乐乐 | 园豆:4823 (老鸟四级) | 2022-11-21 09:48

谢谢,明白了

支持(0) 反对(0) 小科技 | 园豆:197 (初学一级) | 2022-11-21 10:43
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册