.NET应用程序在终止程序之前是否等待所有前台线程完成?

时间:2016-05-31 17:58:32

标签: c# .net multithreading

很抱歉问这个相当愚蠢的问题,但我制作了这个程序来测试在程序终止之前是否等待所有前台线程完成。

但是在这个程序中,只要我按任意键退出程序,主线程就会终止,然后在执行另一个前台线程的过程中关闭应用程序。

using System;
using System.Threading;

namespace ForegroundThreads
{
    // This is a program to test whether or not the application
    // will terminate when there is a pending foreground thread running.

    // In describing the difference between foreground and background threads, 
    // the documentation states that an application will terminate all
    // background threads when all foreground threads have finished execution.
    // This implies that the application will stall the main thread until
    // all foreground threads have completed execution. Let us see if this
    // is the case.

    // Quote:
    // A managed thread is either a background thread or a foreground thread. 
    // Background threads are identical to foreground threads with one exception: 
    // a background thread does not keep the managed execution environment running. 
    // Once all foreground threads have been stopped in a managed process (where the .exe file is a managed assembly), 
    // the system stops all background threads and shuts down. 
    // Source: https://msdn.microsoft.com/en-us/library/h339syd0%28v=vs.110%29.aspx

    class Program
    {
        static void Main(string[] args)
        {
            var t = new Thread(() => { 1000000.Times(() => { Console.WriteLine("Hello"); }); });
            t.Start();

            Console.WriteLine("Press any key to exit the main thread...");
            Console.ReadKey();
        }
    }

    public static class Extensions
    {
        public static void Times(this int numTimes, Action action)
        {
            for (int i = 0; i < numTimes; i++, action()) ;
        }
    }
}

运行此代码时我注意到的行为

在我的机器上,如果我将次数减少到较小的值,比如1000,它会在主线程退出时立即终止所有前台线程。但是,如果我将值设置为大,例如一百万,那么系统会继续运行我创建的前景线程,而不管所有击键,直到它完成一百万次打印。

更新

GSerg链接到另一个问同样的问题。但是,如果你仔细阅读这个问题,那个问题的海报就是在问:“发生了什么事?”

答案只是引用MSDN解释所有前台线程都在等待。我的问题是争论的。

我的问题是 - 为什么程序有时等待前台线程完成,而其他时候则不然。因此,那个问题的答案对我没有帮助。

1 个答案:

答案 0 :(得分:0)

我的坏,我的眼睛没有看到20-20。该程序确实等待生成的前台线程完成执行。

当我通过减少CONFIG += link_pkgconfig PKGCONFIG += QtGStreamer-1.0 方法的整数接收器的值来减少迭代次数时,即使程序实际上已经完成了所有 Hello 的打印在我看来,程序仍然在忙着打印。这让我相信产生的线程仍在运行,当我按下键盘上的任何其他键时,它立即终止了该过程。