有如下两段代码,为什么执行结果不一样?
//代码一 static void Main(string[] args) { for (int i = 0; i < 10; i++) { Task.Factory.StartNew(() => { Console.WriteLine("Task " + i); }); } }
//代码二 static void Main(string[] args) { for (int i = 0; i < 10; i++) { TaskTest(i); } } static void TaskTest(int i) { Task.Factory.StartNew(() => { Console.WriteLine("Task " + i); }); }
为什么第一段代码执行打印出来的i都是10,而第二段代码却是0-9?
望高手赐教,先谢谢了!
代码一改成
for (int i = 0; i < 10; i++)
{
int temp=i;
Task.Factory.StartNew(() => { Console.WriteLine("Task " + temp); });
}
试下结果,你可能会理解了。
谢谢回复,for循环了10次,应该是创建了10个temp到内存中,那是不是每个temp都要等到多线程调用之后才销毁呢(而不是for一个循环结束销毁)?
恩,可以这么理解,for循环是同步执行Task.Factory.StartNew是异步执行。for循环执行完了(i已经等于10了),但是Task.Factory.StartNew没有执行完成。
使用了变量i,当任务执行的时候,i的值已经变10了。
理解几点:
1、Task.Factory.StartNew启动的任务是一个代理,代理用到了变量i。那么,会使用代理运行时的i
2、所谓变量,其实是一个内存地址(在.NET里也一样,只是特殊封装了),因此,虽然运行任务时,i已经不存在,但i的地址还是在的。
3、.net的变量的回收机制。
谢谢回复