这是我的应用程序来执行线程示例,但输出不是预期的,任何人都有任何线索请
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace OTS_Performence_Test_tool
{
class Program
{
static void testThread(string xx)
{
int count = 0;
while (count < 5)
{
Console.WriteLine(xx );
count++;
}
}
static void Main(string[] args)
{
Console.WriteLine("Hello to the this test app ---");
for (int i = 1; i<=3; i++)
{
Thread thread = new Thread(() => testThread("" + i + "__"));
thread.Start();
}
Console.ReadKey();
}
}
}
但是结果却是
3 __
3 __
3 __
3 __
3 __
3 __
3 __
3 __
3 __
3 __
4 __
4 __
4 __
4 __
4 __
任何人都可以解释的事情 感谢
答案 0 :(得分:11)
See Eric Lippert's excellent blog post on this issue.
这是因为访问"modified closure"。
将你的循环体改为:
for (int i = 1; i<=3; i++)
{
int j = i; // Prevent use of modified closure.
Thread thread = new Thread(() => testThread("" + j + "__"));
thread.Start();
}
(请注意,对于foreach
循环,这已在.Net 4.5中修复,但对于for
循环并未修复。)
答案 1 :(得分:3)
封闭。你必须在线程中复制变量以保持当前值,。
现在所有的线程都会以它们运行时的任何值读取变量i - 而不是调用thread.start时的值。
答案 2 :(得分:0)
testThread
对象时,不会调用 Thread
- 只要线程被安排运行,就会调用该方法。这可能会在以后发生。
在您的情况下,线程在for循环结束后开始运行 - 到那时,i
等于3.因此,使用值testThread
调用3
3次。