我一直在尝试实现看起来像这样的多线程:

static void Main(string[] args)
{
        List<Task> tskList = new List<Task>();
        for (int i = 0; i < 100; i++)
        {
            Task taskTemp = new Task(() => { Display(i); });
            taskTemp.Start();
            tskList.Add(taskTemp);

            //Thread.Sleep(10);
        }

        Task.WaitAll(tskList.ToArray());
}

public static void Display(int value)
{
        Thread.Sleep(1000);
        Console.WriteLine(value);
}

没有Thread.Sleep(10)部分,我将输出打印为“100”的100倍,而不是10毫秒的 sleep 时间得到的0到99。
我的猜测是,由于系统安排线程所需的时间以及线程实际开始启动时,该值已达到100,因此可能会发生这种情况。
如果我有足够的等待时间(例如1000毫秒而不是10毫秒),是否可以保证不会出现此问题?还是我应该怀疑CPU使用率过高时,系统可能需要更多时间来安排线程?解决此问题的最佳方法是什么?

预先感谢您的任何投入!

最佳答案

您应该添加一个本地变量来保存“i”,例如:

 for (int i = 0; i < 100; i++)
    {
        var t = i;
        Task taskTemp = new Task(() => { Display(t); });
        taskTemp.Start();
        tskList.Add(taskTemp);

        //Thread.Sleep(10);
    }

10-06 15:05