for循环异步任务时需要注意公共变量的值变化

有时候我们需要循环执行异步任务,并把for循环时的i作为任务编号传入到异步函数中,如果粗心大意的话,很容易写出错误的代码,导致函数中的i是异常的

for (int i = 0; i < 10; i++) { 
                Task.Run(() => {
                    Console.WriteLine(i);  //i都是10
                });
            }

只要稍微理解下就知道问题出在哪了,Task.Run是个异步函数,它调用时不会阻塞代码的执行,所以当第一个Task.Run还没执行到输出信息的时候,for就已经循环完了,并且最后还i++了一下,由于i是公共变量,所以当10个Task.Run执行到要输出的时候,i的值就已经为10了

避免这种现象,只需要中间加个范围变量就行了,比如

for (int i = 0; i < 10; i++) {
                int num = i;
                Task.Run(() => {
                    Console.WriteLine(num);
                });
            }

  这样,每次for循环执行的Task.Run用的就是本次循环的值了

posted @ 2021-05-18 16:18  WmW  阅读(194)  评论(0编辑  收藏  举报