首页 新闻 会员 周边

多线程(Task)的问题

0
悬赏园豆:20 [已解决问题] 解决于 2015-03-30 17:13

有如下两段代码,为什么执行结果不一样?

//代码一
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?

望高手赐教,先谢谢了!

wulawulaho的主页 wulawulaho | 初学一级 | 园豆:74
提问于:2015-03-30 15:24
< >
分享
最佳答案
0

代码一改成

for (int i = 0; i < 10; i++)

{

int temp=i;

Task.Factory.StartNew(() => { Console.WriteLine("Task " + temp); });

}

试下结果,你可能会理解了。

收获园豆:18
hacon_robert | 菜鸟二级 |园豆:230 | 2015-03-30 15:38

谢谢回复,for循环了10次,应该是创建了10个temp到内存中,那是不是每个temp都要等到多线程调用之后才销毁呢(而不是for一个循环结束销毁)?

wulawulaho | 园豆:74 (初学一级) | 2015-03-30 16:22

恩,可以这么理解,for循环是同步执行Task.Factory.StartNew是异步执行。for循环执行完了(i已经等于10了),但是Task.Factory.StartNew没有执行完成。

hacon_robert | 园豆:230 (菜鸟二级) | 2015-03-30 16:28
其他回答(1)
0

使用了变量i,当任务执行的时候,i的值已经变10了。

 

理解几点:

1、Task.Factory.StartNew启动的任务是一个代理,代理用到了变量i。那么,会使用代理运行时的i

2、所谓变量,其实是一个内存地址(在.NET里也一样,只是特殊封装了),因此,虽然运行任务时,i已经不存在,但i的地址还是在的。

3、.net的变量的回收机制。

收获园豆:2
519740105 | 园豆:5810 (大侠五级) | 2015-03-30 16:37

谢谢回复

支持(0) 反对(0) wulawulaho | 园豆:74 (初学一级) | 2015-03-30 17:14
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册