第一部分:
Task[] tasks = new Task[4];
int[] it = new int[4];
public void TaskDel(int obj)
{
while (true)
{
Thread.Sleep(10);
it[obj]++;
}
}
第二部分1:
for (int a = 0; a < 4; a++)
{
tasks[a] = Task.Factory.StartNew(()=> TaskDel(a));
}
第二部分2:
tasks[0] = Task.Factory.StartNew(() => TaskDel(0));
tasks[1] = Task.Factory.StartNew(() => TaskDel(1));
tasks[2] = Task.Factory.StartNew(() => TaskDel(2));
tasks[3] = Task.Factory.StartNew(() => TaskDel(3));
问题是,我使用第二部分1的方式,后续会有提示 it[obj]++; 这里面有超界限,就obj能大于等于4了;而我用第二部分2的方式,则是正常的。求问为什么,或者指导下,我还想用1方式,该如何改?
第二部分1因为a引用的是自循环完毕后的a的值为4越界了。需要像js一样做个闭包。。示例代码如下
using System;
using System.Threading;
using System.Threading.Tasks;
namespace ConsoleApp1
{
class Program
{
static Task[] tasks = new Task[4];
static int[] it = new int[4];
public static void TaskDel(int obj)
{
while (true)
{
Thread.Sleep(10);
it[obj]++;
}
}
static Action CreateFun(int i)
{
return new Action(() => { TaskDel(i); });
}
static void Main(string[] args)
{
for (int a = 0; a < 4; a++)
{
tasks[a] = Task.Factory.StartNew(CreateFun(a));
}
Console.ReadKey();
}
}
}
int i=a;
tasks[a] = Task.Factory.StartNew(()=> TaskDel(i));