C#的Task循环赋值的问题

复制代码
 static async Task Main(string[] args)
 {
     for (int i = 0; i < 3; i++)
     {
         Task.Run(() => {
            T(i);
         });
        // Thread.Sleep(1);
     }
     Console.ReadLine();
     void T(int i)
     {
         Thread.Sleep(2000);
         Console.WriteLine($"内部:{i}");
     }
 }
复制代码

上图代码 运行结果是这样的

然后把注释去掉 

 Thread.Sleep(1);

结果是这样的

 出现这样的结果: 应该是这3次循环中, i 指向的内存地址都是一样的,并且task.run里面是异步,它会立刻返回(因此会导致循环结束了,但是task.run里面的其实还没正式开始运行,因此 i 就是最后一次循环的值,那么内部方法T赋值的 i 也是最后一次循环的值,所以呈现出结果都是3).

而加入 Thread.Sleep(1) 可以让执行的时间相对延长一点,导致内部T赋值的 i 有时间可以赋值,所以呈现结果就是0,1,2

 

额外内容: 

  for (int i = 0; i < 3; i++)
  {
      int a = i;
      Task.Run(() => {
         T(a);
      });
      //Thread.Sleep(1);
  }

用一个中间变量赋值,因为此处是值类型是完全复制的,因此不会出现 i 的引用的问题(有点类似js的闭包),以下是结果

 

posted @   大大只植物  阅读(230)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
点击右上角即可分享
微信分享提示