首页 新闻 会员 周边 捐助

新人求教一个关于C# task的疑惑

0
悬赏园豆:20 [已解决问题] 解决于 2015-10-10 17:35
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

C#
yyyaaaa的主页 yyyaaaa | 初学一级 | 园豆:6
提问于:2015-10-10 17:09
< >
分享
最佳答案
0

楼上那个办法是可行的。

同时还有一个办法就是循环换成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是从内存中取得。

收获园豆:10
请叫我头头哥 | 大侠五级 |园豆:9382 | 2015-10-10 17:34
其他回答(3)
0

。。。这就是多线程啊,你的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());    
收获园豆:8
顾晓北 | 园豆:10898 (专家六级) | 2015-10-10 17:21
0

同意楼上

执行顺序 是不一定的  所以

每次输出是不一定相同的

只是针对这个例子(并没有什么意义)  在楼上代码的基础上 可以在for循环 加个  System.Threading.Thread.Sleep(100);

收获园豆:2
clarlespeng | 园豆:469 (菜鸟二级) | 2015-10-10 17:31
0

这是闭包的缘故,熟悉JS的话,应该很容易理解。说白了,就是循环先跑完,然后才是Task执行,这个时候去查找i的时候,i的值已经变成10了。

幻天芒 | 园豆:37207 (高人七级) | 2015-10-10 21:22
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());

休眠的时间改改,很有趣。

支持(0) 反对(0) 幻天芒 | 园豆:37207 (高人七级) | 2015-10-10 21:27
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册