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的闭包),以下是结果
标签:
c# .net core
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异