帮我分析一下 为什么在for循环中不写int workId = i;导致SingleWork函数打印输出结果workId都是100 代吗如下 static void UseTaskCPU() { // 创建任务list List<Task> tasks = new List<Task>(); for (int i = 0; i < 100; i++) { int workId = i; // 不写这句会导致task启动新的线程过程中for循环继续执行,i的值不断被累加 tasks.Add(Task.Run(() => { SingleWork(workId); })); } //Task.WaitAll(tasks.ToArray()); // 接受一个Task数组 } private static void SingleWork(int workId) { Thread.Sleep(1000); Console.WriteLine($"当前workId:{workId}"); Thread.Sleep(2000); }
时间: 2023-02-12 11:47:38 浏览: 115
在 for 循环中,如果不写 int workId = i; 的话,由于 C# 中的闭包的特性,当 SingleWork 函数被启动为新的线程时,for循环会继续执行,导致 i 的值不断被累加。而 SingleWork 函数中使用的 workId 变量实际上是一个引用,因此在多个线程中同时修改这个变量,就会导致最后输出的结果都是100。而写上 int workId = i; 就可以避免这个问题,因为每次循环都会创建一个新的 workId 变量,避免了多线程中修改同一个变量的冲突。
相关问题
帮我分析一下 为什么在for循环中不写int workId = i;导致SingleWork函数打印输出结果workId都是100
在这个代码中,for循环的循环变量i是在循环过程中不断更新的,而SingleWork函数中的workId是被赋值为i的一个副本,当循环结束时i的值为100,所以SingleWork函数中的workId也为100.
如果在for循环中写了 int workId = i; 或者是workId = i,那么SingleWork函数中的workId就会是当前循环时i的值。
为什么workid为null
作为AI语言模型,我不能确定您提到的“workid”是指哪个具体的内容。但一般来说,一个变量或属性的值为null可能有以下原因:
1. 该变量或属性在程序中还没有被赋值;
2. 该变量或属性赋值时出现了错误;
3. 该变量或属性在某些情况下被有意地设置为null。
如果您需要更具体的答案,请提供更多相关信息。
阅读全文