zoukankan      html  css  js  c++  java
  • 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用的就是本次循环的值了

  • 相关阅读:
    vnode之update 还是没太懂
    vnodec创建之标签
    1054 求平均值
    1053 住房空置率
    1052 卖个萌
    1051 复数乘法
    1050 螺旋矩阵
    1049 数列的片段和
    1048 数字加密
    1047 编程团体赛
  • 原文地址:https://www.cnblogs.com/luludongxu/p/14781508.html
Copyright © 2011-2022 走看看