繁体   English   中英

C#使用Task类进行多线程处理

[英]C# Multi threading using Task class

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

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”而不是0到99,我得到的睡眠时间为10毫秒。 我的猜测是,这可能会发生,因为系统调度线程所需的时间以及线程即将实际启动的时间,该值已达到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);
    }

只需复制“i”到“i1”并将其用作局部变量。 “我”总是被改变,这就是为什么你得到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);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM