• C# for循环创建多线程


    这里仅讨论Task多线程编程,不讨论其他可以使用多线程的情况,比如Beginxxx,Thread等

    一般情况下,如果有多个线程需要同是启动,且每个线程中使用了集合collection中的序号。

    比如参数中带数组中的一个数据,比如:

    int[] nArray = new int[] {0,1,2,3};
    

    然后需要用多线程的方式,同时处理其中的每个数据。

    如果你写成,下面这种方式:

    Task[] taskArray = new Task[4];
    for (int i=0; i < 4; i++)
    {
          task[i] = Test(nArray[i]);
    }
    

    就会发现,抛出了数组越界的异常。

    但是如果你改成:

    Task[] taskArray = new Task[4];
    for (int i=0; i < 4; i++)
    {
          int n = i;
          task[n] = Test(nArray[n]);
    }
    

    就会发现,多线程运行正常了。

    原因是什么呢?

    第一个是因为,Task因为是新的语法糖,处理Task的时候,需要一定的时间,这个时间肯定是比for里面

    i++;
    i<4;
    

    这两句话要来的长的,所以等实际上生成四个Task,准备启动的时候,就会发现,这个时候的i已经加到4了,自然就产生了越界。

    第二个方法,能生效,是因为 n = i;将每个工作域中的i都赋予了局部变量n,这样每个Task的参数即为局部变量n,就不会因为i的变化而变化。

  • 相关阅读:
    通过 phantomjs抓取仁医在线的练习题
    Fork/Join框架
    联表命中索引
    docker容器安装Vim
    docker 配合nginx部署vue项目
    docker安装与简单使用
    delphi IdHTTP 请求抓包分析
    delphi XML 文档注释
    关于Swing设置窗口图标后出现卡顿以及其他问题
    内部类和静态内部类的区别
  • 原文地址:https://www.cnblogs.com/ligiggy/p/13674225.html
Copyright © 2020-2023  润新知