C# 中Task线程带参数的问题,求解释,求帮助

第一部分:

        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));