我创建了这个测试程序,试图更好地理解线程:
namespace ThreadTest
{
public class Class1
{
static Number number = new Number();
static public void Go()
{
Thread t1 = new Thread(new ThreadStart(IncrementNumber));
t1.Start();
IncrementNumber();
}
public static void IncrementNumber()
{
number.Inc();
}
}
public class Number
{
int x = 0;
public void Inc()
{
x++;
Debug.Write(x);
Debug.Write(Environment.NewLine);
}
public override string ToString()
{
return x.ToString();
}
}
}
我只是通过调用ThreadTest.Class1.Go()从立即窗口执行它。我注意到从一次执行到下一次执行,只要它不需要重新编译,静态成员就会保留在内存中并继续重用它们。
以下是连续四次执行后的即时窗口:
ThreadTest.Class1.Go()
2
1
Expression has been evaluated and has no value
ThreadTest.Class1.Go()
3
4Expression has been evaluated and has no value
ThreadTest.Class1.Go()
ThreadTest.Class1.Go()
An expression evaluation is already in progress.
第一次执行看起来像我期望的那样。
第二次执行没有设法编写最终的Environment.NewLine。这可能是因为主线程的执行在t1执行之前完成,因此t1有时间写入数字,而不是新行?这似乎不太可能,但这是我现在能够提出的唯一解释。
第三次执行只是挂起,这可以通过执行第四次尝试的输出来证明。它为什么要挂?
答案 0 :(得分:2)
实际上,主线程的执行可能已经停止了。
如果您在不同的运行中获得不同的输出,则表明这种情况正在发生。
你需要描述"挂起"完全回答这个方面要好一点。如果根本没有输出,则表示主线程在t1
的任何输出之前完成。如果没有输出但程序没有结束,请尝试打破执行并查看每个线程所在的线路以获取线索。
尝试在主线程中加入t1
,以防止程序在准备好之前退出。