var taskList = new List<Task>(); for (int i = 0; i < 10; i++) { taskList.Add(Task.Factory.StartNew(() => { Console.WriteLine(i.ToString()); })); }
Task.WaitAll(taskList.ToArray());
上面这段代码为什么输出的全是10啊
我怎么样才能输出0,1,2,3,4,5,6...10
楼上那个办法是可行的。
同时还有一个办法就是循环换成foreach。
List<string> temp = new List<string>(); temp.Add("1"); temp.Add("2"); temp.Add("3"); var taskList = new List<Task>(); foreach (var number in temp) { taskList.Add(Task.Factory.StartNew(() => { Console.WriteLine(number); })); } Task.WaitAll(taskList.ToArray()); Console.ReadKey();
原因很简单,因为int是值类型,多线程这里取得i是从内存中取得。
。。。这就是多线程啊,你的Task是开启一个线程,然后继续运行循环,开启了10个线程,然后这十个线程指不定什么时候执行呢。。。
你可以试试这样:
var taskList = new List<Task>(); for (int i = 0; i < 10; i++) { int temp=i; taskList.Add(Task.Factory.StartNew(() => { Console.WriteLine(temp.ToString()); })); } Task.WaitAll(taskList.ToArray());
同意楼上
执行顺序 是不一定的 所以
每次输出是不一定相同的
只是针对这个例子(并没有什么意义) 在楼上代码的基础上 可以在for循环 加个 System.Threading.Thread.Sleep(100);
这是闭包的缘故,熟悉JS的话,应该很容易理解。说白了,就是循环先跑完,然后才是Task执行,这个时候去查找i的时候,i的值已经变成10了。
var taskList = new List<Task>(); for (int i = 0; i < 10; i++) { Thread.Sleep(50); taskList.Add(Task.Factory.StartNew(() => { Console.WriteLine(i.ToString()); })); } Task.WaitAll(taskList.ToArray());
休眠的时间改改,很有趣。