for循环里面使用task

今天遇到一个问题

 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。

或者异步代码块放在一个方法里面,仍能得到同样的结果。

但是可能导致顺序混乱。

因为多线程的启动并不意味着立马进行,需要等待操作系统的调度。

 

posted @ 2021-04-21 16:02  隨興∥隨心  阅读(1262)  评论(0编辑  收藏  举报