八个细胞 2022-12-23 14:06 采纳率: 50%
浏览 22

C# 多线程 lambda传参

C# 多线程用 lambda 传参,遇到的疑问。
代码如下,期待的运行结果是线程 0 ~ 4 随机顺序打印。

void print(int i)
{
    Console.WriteLine("Thread {0}.", i.ToString());
}

for (int i = 0; i < 5; i++)
{
    Thread thread = new Thread(() => print(i));
    thread.Start();
}

实际运行结果:

img

!!为什么 4 会出现两次,而且为什么会有 5 没有 0 和 1 ??
按我的认知这可能代表着传入的 i 不是当时的 i ,是动态变化的值,但函数传参不应该是传值吗,为什么会这样?

PS:在循环内部设置 int j = i;后传入 j 就可以达成我最开始期望的结果,但还是想知道会这样的根本原因是什么?

  • 写回答

1条回答 默认 最新

  • 於黾 2022-12-23 14:19
    关注

    不是回答过了,怎么又发一遍
    典型的闭包问题

    评论

报告相同问题?

问题事件

  • 创建了问题 12月23日

悬赏问题

  • ¥15 BP神经网络控制倒立摆
  • ¥20 要这个数学建模编程的代码 并且能完整允许出来结果 完整的过程和数据的结果
  • ¥15 html5+css和javascript有人可以帮吗?图片要怎么插入代码里面啊
  • ¥30 Unity接入微信SDK 无法开启摄像头
  • ¥20 有偿 写代码 要用特定的软件anaconda 里的jvpyter 用python3写
  • ¥20 cad图纸,chx-3六轴码垛机器人
  • ¥15 移动摄像头专网需要解vlan
  • ¥20 access多表提取相同字段数据并合并
  • ¥20 基于MSP430f5529的MPU6050驱动,求出欧拉角
  • ¥20 Java-Oj-桌布的计算