为什么这个线程导致我的应用程序在多次执行后挂起?

时间:2014-04-23 20:56:25

标签: c# multithreading

我创建了这个测试程序,试图更好地理解线程:

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有时间写入数字,而不是新行?这似乎不太可能,但这是我现在能够提出的唯一解释。

第三次执行只是挂起,这可以通过执行第四次尝试的输出来证明。它为什么要挂?

1 个答案:

答案 0 :(得分:2)

实际上,主线程的执行可能已经停止了。

如果您在不同的运行中获得不同的输出,则表明这种情况正在发生。

你需要描述"挂起"完全回答这个方面要好一点。如果根本没有输出,则表示主线程在t1的任何输出之前完成。如果没有输出但程序没有结束,请尝试打破执行并查看每个线程所在的线路以获取线索。

尝试在主线程中加入t1,以防止程序在准备好之前退出。