Search code examples
c#multithreadingapplication-shutdown

Shutting down a foreground thread on application quit?


I am trying to figure out a way to shutdown my foreground thread in the event that my application quits/terminates/etc..

From what I have tested and read about, it is to my understanding that the main thread is always last to execute. Is this always true?

If so, then could someone suggest of a way to graciously signal a shutdown of a foreground thread? (in the event of application quit) Or is this even possible?

I am kinda getting a feeling that a foreground thread should be responsible of shutting down itself (not relying on a outside signal), unless it is known that the process will not terminate/shutdown prematurely. Is this also true?

I have a couple of reasons for using a foreground thread instead of a background thread:

  1. My thread allocates [ThreadStatic]native memory using Marshal.AllocHGlobal, and it needs to be properly released.

  2. It is a server application and preferably it would send all the queued packets before shutting down (not essential).

For example:

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

This results in:

  • stopped is made true
  • OnProcessExit is not called. (I have also tried explicitly calling EndServer() but got the same result
  • application hangs

So I suspect (but I am not sure) that since the main thread is last to execute, the program is waiting for ReadWrite to finish, which means what I am doing is not possible?

If it is not possible, I will either: Look to see if it is possible to do with background thread, or I will look into redesigning my native memory implementation.


Solution

  • It turns out I had no idea that native memory is freed when program is closed. Putting my thread in background will solve the rest of my issues.

    Edit for future reference: A background thread did not solve point 2, though it was not essential for me so I went ahead with this solution anyways.