C# 如何在调用进程退出或终止时优雅地结束线程?

C# 如何在调用进程退出或终止时优雅地结束线程?,c#,multithreading,garbage-collection,finalizer,C#,Multithreading,Garbage Collection,Finalizer,因此,我想到了一个类的实例,我希望在该类的生命周期中运行一个线程,但在调用该类的进程不再运行时终止。这不是父线程终止子线程的情况,而是单个旋转(可能在等待循环中)线程在不占用资源的情况下优雅地退出 我认为C++中,可以使用析构函数中的一个易失性布尔来终止线程,但是在C ^中,~不是析构函数,它是终结器。我无法使用终结器成功终止线程。也许我遗漏了什么。我知道更好的做法是让所有线程自然死亡,而不发出终止的信号,但每次我需要做一些事情时生成一个线程是没有效率的。是的,我知道线程池,但我认为最好是让一个

因此,我想到了一个类的实例,我希望在该类的生命周期中运行一个线程,但在调用该类的进程不再运行时终止。这不是父线程终止子线程的情况,而是单个旋转(可能在等待循环中)线程在不占用资源的情况下优雅地退出

我认为C++中,可以使用析构函数中的一个易失性布尔来终止线程,但是在C ^中,~不是析构函数,它是终结器。我无法使用终结器成功终止线程。也许我遗漏了什么。我知道更好的做法是让所有线程自然死亡,而不发出终止的信号,但每次我需要做一些事情时生成一个线程是没有效率的。是的,我知道线程池,但我认为最好是让一个侦听器线程响应对该类的调用,并在将该类放到gc上时让它优雅地消亡


我认为,真正的诀窍是,我可以知道,或者我如何知道运行线程的类何时第一次放在gc上。我要找的是什么?我没有在这里使用任何非托管代码。

我认为您基本上有两个明智的选择

选择一:

如果您确实没有使用任何非托管资源,那么您可以在程序关闭时让系统关闭线程。这显然是最简单的解决办法

如果您使用的对象具有应该调用的dispose方法,您只需担心。其中包括打开的文件,但可能不包括字体之类的内容

如果执行此操作,则必须确保该线程将作为“后台”线程运行。后台线程和前台线程之间的唯一区别是,当程序关闭时,所有后台线程将自动终止,但前台线程不会

如果使用
任务
,默认情况下它将作为后台线程运行

如果你的线程将要对磁盘执行一些IO操作,或者执行任何不能被中断的操作,那么你肯定不想这样做

选择二:

添加一个线程取消机制,使用并安排在程序关闭时使用它,然后等待线程退出

在这种情况下,您不会真正关心线程是前台还是后台,因为您将自己管理程序关闭,并且线程将在程序退出之前正确停止

如果采用这种方法,可以将线程取消逻辑和其他线程处理方法封装在一个封装线程的类中。然后,您可以添加一个
Dispose()
方法,这样您就可以使用
块在
中创建类,以确保即使遇到异常也能正确关闭


我经常采用这种方法,而且似乎效果很好。

似乎捕获应用程序域卸载可能会有所帮助:相关: