我试图掌握.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。
答案 0 :(得分:3)
这是因为您的任务是在关闭执行之前创建的。如果您在睡眠调用之前将I的值复制到变量,或者更好,将其作为参数传递给您的操作,您应该得到所需的结果。