C#使用Task类的多线程

本文关键字:多线程 Task 使用 | 更新日期: 2023-09-27 17:59:26

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

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

没有线程。睡眠(10)部分,我得到的输出打印为100倍"100",而不是0到99,我得到10毫秒的睡眠时间。我的猜测是,之所以会发生这种情况,是因为系统调度线程所需的时间,而当线程即将实际启动时,该值已经达到100。如果我有足够的等待时间(比如1000毫秒而不是10毫秒),是否可以保证不会出现这个问题?或者,当CPU利用率过高时,我应该怀疑系统可能需要更多的时间来调度线程吗?解决这个问题的最佳方法是什么?

提前感谢您的任何意见!

C#使用Task类的多线程

您应该添加一个本地变量来保存"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);
    }

只需将"i"复制到"i1",并将其用作局部变量。"i"总是变化的,这就是为什么你得到100 100 100……:

private static void Main(string[] args)
{
  var tskList = new List<Task>();
  for (var i = 0; i < 100; i++)
  {
    var i1 = i;
    var taskTemp = new Task(() => { Display(i1); });
    taskTemp.Start();
    tskList.Add(taskTemp);
  }
  Task.WaitAll(tskList.ToArray());
}
public static void Display(int value)
{
  Thread.Sleep(1000);
  Console.WriteLine(value);
}