今天遇到一个问题
for(var i=1;i<=5;i++) { var task = Task.Run(() => { Console.WriteLine(i); }); tasks.Add(task); } Task.WaitAll(tasks.ToArray());
为什么打印出来的i都是6.而不是期待中的1,2,3,4,5
经前辈指导。
因为for循环在数据量很小的时候,for循环结束时 task启动了,但是可能还未执行。
而且共享了一个变量i。所以线程正式运行的时候i的zhi已经为6.
那么我们如何解决这个问题,一是在task前声明一个变量来接收i的值,再把变量传递给 task。
或者异步代码块放在一个方法里面,仍能得到同样的结果。
但是可能导致顺序混乱。
因为多线程的启动并不意味着立马进行,需要等待操作系统的调度。