Выключение потока переднего плана при выходе из приложения? - PullRequest
0 голосов
/ 27 февраля 2019

Я пытаюсь найти способ закрыть поток переднего плана в случае, если мое приложение завершает работу / завершает работу / и т.д. ..

Из того, что я проверил и прочитал, насколько я понимаю, этоосновной поток всегда выполняется последним.Всегда ли это так?

Если так, то может ли кто-нибудь предложить способ любезно сигнализировать об отключении потока переднего плана?(в случае выхода из приложения) Или это вообще возможно?

У меня возникает ощущение, что поток переднего плана должен быть ответственным за само отключение (не полагаясь на внешний сигнал), если не известно, что процесс не завершится / завершится преждевременно.Это также верно?

У меня есть несколько причин для использования потока переднего плана вместо потока фона:

  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 сделаноtrue
  • OnProcessExit не вызывается.(Я также пытался явно вызвать EndServer(), но получил тот же результат
  • приложение зависает

Так что я подозреваю (но я не уверен), что, поскольку основной поток является последнимвыполнить, программа ожидает завершения ReadWrite, а это значит, что то, что я делаю, невозможно?

Если это невозможно, я тоже буду: Посмотрите, возможно ли сделать с фономили я попытаюсь изменить мою собственную реализацию памяти.

Спасибо заранее.

1 Ответ

0 голосов
/ 27 февраля 2019

Оказывается, я понятия не имел, что родная память освобождается при закрытии программы.Помещение моей темы в фоновый режим решит остальную часть моих проблем.

Редактировать для дальнейшего использования: фоновая тема не решила пункт 2, хотя для меня это было не существенно, поэтому я все равно продолжил работу с этим решением.

...