c#高手进。。。。

for (int i = 1; i < 100; i++)            {                ThreadPool.QueueUserWorkItem((o) =>                {                    int z = i;                    Thread.Sleep(1000);                    Console.Write(z.ToString());                     Console.Write(Environment.NewLine);                 });            } 为啥输出的都是100呢,,不是用z保存了变量了吗
收到一只叮咚
浏览 364回答 9
9回答

隔江千里

for (int i = 1; i < 100; i++)            {                ThreadPool.QueueUserWorkItem((o) =>                {                    int z = (int)o;                    Thread.Sleep(1000);                    Console.Write(z.ToString());                     Console.Write(Environment.NewLine);                 },i);            }

海绵宝宝撒

老兄位置放错啦!~  看我这个吧: for (int i = 1; i < 100; i++) { ThreadPool.QueueUserWorkItem(start => { int z = i; Console.WriteLine(z.ToString()); }); Thread.Sleep(1);//在循环中需要调用一下,由于被置于ThreadPool中的操作是异步,所以还没有来的执行,z就被for循环改变,永远是100 }

慕神8447489

z不是值类型嘛?

慕码人2483693

@彬彬@科比: 其实他回答得不是z是否是值类型,而是在第一次执行int z = i;这句的时候,i已经是100了。

一只名叫tom的猫

@滴答的雨: for循环不就是添加99个操作到线程池中嘛。。怎么会i已经是100呢!!?

墨色风雨

@滴答的雨: 这段代码的执行顺序到底是怎样的??线程次里面什么时候才执行

UYOU

还没有来得及执行是什么意思??难道会等for循环执行后才执行???

富国沪深

你的问题可能也已经解决了,但是这个问题你为什么没排查出来错误?按说应该可以的,你应该没有断点调试吧。有时候断点很方便的

汪汪一只猫

i是公共的变量。你所有的100个后台的线程都是有了它,这个情况下你输出的时候,主线程for循环已经走完,此时i是100,你说不是100,难道是1 , 2, 3。。。。。 什么的  如果要输入1,2,3..... for (int i = 1; i < 100; i++)            { int z = i;                ThreadPool.QueueUserWorkItem((o) =>                {                    Thread.Sleep(1000);                    Console.Write(z.ToString());                     Console.Write(Environment.NewLine);                 });            }
打开App,查看更多内容
随时随地看视频慕课网APP