有时候我们需要循环执行异步任务,并把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用的就是本次循环的值了