在循环中使用Task.Factory.StartNew

时间:2015-11-23 11:38:41

标签: c# multithreading task

我试图掌握.NET中的多线程编程。

我想在for循环中创建100个任务,每个任务将休眠1秒,然后输出用它创建的 i 和它的托管线程ID。完成所有任务后,我想输出经过的总时间。

所以我正在运行这个简单的代码

    private static void Main(string[] args)
    {
        List<Task> tasks = new List<Task>();

        for (int i = 0; i < 100; i++)
        {
            tasks.Add(Task.Factory.StartNew(() =>
            {
                Thread.Sleep(1000);
                Console.WriteLine(i.ToString() + "  " + Thread.CurrentThread.ManagedThreadId);
            }));
        }
        Stopwatch watch = new Stopwatch();

        watch.Start();
        var final = Task.Factory.ContinueWhenAll(tasks.ToArray(), doneTasks =>
        {
            watch.Stop();
            Console.WriteLine("done in {0}", watch.Elapsed);
        });
        Console.ReadKey();
    }

我得到的输出:

100  24
100  23
...
100  14
100  25
done in 00:00:12.0044853

我不明白为什么我的所有相同,为什么 100 ?直观地说,我希望它们是0~99,但不是全部都是100。

1 个答案:

答案 0 :(得分:3)

这是因为您的任务是在关闭执行之前创建的。如果您在睡眠调用之前将I的值复制到变量,或者更好,将其作为参数传递给您的操作,您应该得到所需的结果。