我正在尝试找出一种方法来在我的应用程序退出/终止/等情况下关闭我的前台线程。
根据我的测试和了解,据我了解,主线程总是最后执行。总是这样吗?
如果是这样,那么有人可以建议一种方法来优雅地发出关闭前台线程的信号吗? (如果退出应用程序)还是有可能吗?
我有点感觉,前台线程应该负责关闭自身(不依赖外部信号),除非已知该进程不会过早终止/关闭。这也是真的吗?
我有两个使用前景线程而不是背景线程的原因:
我的线程使用[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
为真OnProcessExit
未调用。 (我也尝试过显式调用EndServer()
,但得到了相同的结果因此,我怀疑(但不确定),由于最后执行主线程,程序正在等待ReadWrite
完成,这意味着我无法执行此操作吗?
如果不可能,我将:看是否可以使用后台线程,或者我将研究重新设计本机内存实现。
非常感谢。
答案 0 :(得分:1)
原来,我不知道关闭程序时会释放本地内存。将我的主题放在后台将解决我的其余问题。
编辑以供将来参考: 后台线程不能解决第2点,尽管这对我来说不是必需的,所以无论如何我还是继续使用此解决方案。