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

时间:2019-02-27 02:46:24

标签: c# multithreading application-shutdown

我正在尝试找出一种方法来在我的应用程序退出/终止/等情况下关闭我的前台线程。

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

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

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

我有两个使用前景线程而不是背景线程的原因:

  1. 我的线程使用[ThreadStatic]分配Marshal.AllocHGlobal本机内存,并且需要正确释放它。

  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();
    }

这将导致以下结果:

  • stopped为真
  • OnProcessExit未调用。 (我也尝试过显式调用EndServer(),但得到了相同的结果
  • 应用程序挂起

因此,我怀疑(但不确定),由于最后执行主线程,程序正在等待ReadWrite完成,这意味着我无法执行此操作吗?

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

非常感谢。

1 个答案:

答案 0 :(得分:1)

原来,我不知道关闭程序时会释放本地内存。将我的主题放在后台将解决我的其余问题。

编辑以供将来参考: 后台线程不能解决第2点,尽管这对我来说不是必需的,所以无论如何我还是继续使用此解决方案。