在应用程序退出时关闭前台线程?

Shutting down a foreground thread on application quit?

我正在尝试找出一种方法来关闭我的前台线程,以防我的应用程序 quits/terminates/etc..

根据我的测试和阅读,据我了解,主线程总是最后执行。这总是正确的吗?

如果是这样,那么有人可以建议一种方法来优雅地发出关闭前台线程的信号吗? (在应用程序退出的情况下)或者这甚至可能吗?

我有点感觉前台线程应该负责自行关闭(不依赖于外部信号),除非知道该进程不会过早 terminate/shutdown。这也是真的吗?

我有几个使用前台线程而不是后台线程的原因:

  1. 我的线程使用Marshal.AllocHGlobal分配[ThreadStatic]本机内存,需要适当释放。

  2. 它是一个服务器应用程序,最好它会在关闭之前发送所有排队的数据包(不是必需的)。

例如:

 volatile bool running = true;

 static void Main()
        {
            AppDomain.CurrentDomain.ProcessExit += new 
            EventHandler(OnProcessExit);
            var t = new Thread(ReadWrite);
            t.Start();
            ConsoleKeyInfo cki;
            Console.WriteLine("Running..\n");
            bool stopped = false;
            while(!stopped)
            {
                // do server stuff..
                   .......

                if (Console.KeyAvailable)
                {
                    cki = Console.ReadKey(true);
                    if (cki.Key == ConsoleKey.X)
                    {
                        stopped = true;
                    }
                }
            }
        }

    private void ReadWrite()
    {
        while (running)
        {
            // do stuff....
               ....

            Thread.Sleep(15);
        }
        FreeMemory();
    }


    public void EndServer()
    {
        FreeMemory();
        running = false;
        // do other stuff...
    }

    private void OnProcessExit(object sender, EventArgs e)
    {
        EndServer();
    }

这导致:

所以我怀疑(但我不确定)由于主线程是最后执行的,程序正在等待ReadWrite完成,这意味着我正在做的事情是不可能的?

如果不可能,我会:看看是否可以使用后台线程,或者我会考虑重新设计我的本机内存实现。

原来我不知道程序关闭时会释放本机内存。将我的线程置于后台将解决我的其余问题。

编辑以供将来参考: 后台线程没有解决第 2 点,虽然它对我来说不是必需的,所以我还是继续使用这个解决方案。