Я пытаюсь найти способ закрыть поток переднего плана в случае, если мое приложение завершает работу / завершает работу / и т.д. ..
Из того, что я проверил и прочитал, насколько я понимаю, этоосновной поток всегда выполняется последним.Всегда ли это так?
Если так, то может ли кто-нибудь предложить способ любезно сигнализировать об отключении потока переднего плана?(в случае выхода из приложения) Или это вообще возможно?
У меня возникает ощущение, что поток переднего плана должен быть ответственным за само отключение (не полагаясь на внешний сигнал), если не известно, что процесс не завершится / завершится преждевременно.Это также верно?
У меня есть несколько причин для использования потока переднего плана вместо потока фона:
Мой поток выделяет [ThreadStatic]
собственная память, использующая Marshal.AllocHGlobal
, и она должна быть должным образом освобождена.
Это серверное приложение, и желательно, чтобы оно отправляло все пакеты в очереди перед выключением (не обязательно).
например,
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
, а это значит, что то, что я делаю, невозможно?
Если это невозможно, я тоже буду: Посмотрите, возможно ли сделать с фономили я попытаюсь изменить мою собственную реализацию памяти.
Спасибо заранее.