Loading

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的变化而变化。

posted @ 2020-09-15 17:25  ligiggy  阅读(7654)  评论(0编辑  收藏  举报