在应用程序退出时关闭前台线程?
Shutting down a foreground thread on application quit?
我正在尝试找出一种方法来关闭我的前台线程,以防我的应用程序 quits/terminates/etc..
根据我的测试和阅读,据我了解,主线程总是最后执行。这总是正确的吗?
如果是这样,那么有人可以建议一种方法来优雅地发出关闭前台线程的信号吗? (在应用程序退出的情况下)或者这甚至可能吗?
我有点感觉前台线程应该负责自行关闭(不依赖于外部信号),除非知道该进程不会过早 terminate/shutdown。这也是真的吗?
我有几个使用前台线程而不是后台线程的原因:
我的线程使用Marshal.AllocHGlobal
分配[ThreadStatic]
本机内存,需要适当释放。
它是一个服务器应用程序,最好它会在关闭之前发送所有排队的数据包(不是必需的)。
例如:
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
完成,这意味着我正在做的事情是不可能的?
如果不可能,我会:看看是否可以使用后台线程,或者我会考虑重新设计我的本机内存实现。
原来我不知道程序关闭时会释放本机内存。将我的线程置于后台将解决我的其余问题。
编辑以供将来参考:
后台线程没有解决第 2 点,虽然它对我来说不是必需的,所以我还是继续使用这个解决方案。
我正在尝试找出一种方法来关闭我的前台线程,以防我的应用程序 quits/terminates/etc..
根据我的测试和阅读,据我了解,主线程总是最后执行。这总是正确的吗?
如果是这样,那么有人可以建议一种方法来优雅地发出关闭前台线程的信号吗? (在应用程序退出的情况下)或者这甚至可能吗?
我有点感觉前台线程应该负责自行关闭(不依赖于外部信号),除非知道该进程不会过早 terminate/shutdown。这也是真的吗?
我有几个使用前台线程而不是后台线程的原因:
我的线程使用
Marshal.AllocHGlobal
分配[ThreadStatic]
本机内存,需要适当释放。它是一个服务器应用程序,最好它会在关闭之前发送所有排队的数据包(不是必需的)。
例如:
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
完成,这意味着我正在做的事情是不可能的?
如果不可能,我会:看看是否可以使用后台线程,或者我会考虑重新设计我的本机内存实现。
原来我不知道程序关闭时会释放本机内存。将我的线程置于后台将解决我的其余问题。
编辑以供将来参考: 后台线程没有解决第 2 点,虽然它对我来说不是必需的,所以我还是继续使用这个解决方案。