所以,我基本上有这个:
public void DoThisThing()
{
Task.Run(() =>
{
while(true)
{
//Do things
}
}
}
应用程序的启动基本上会调用DoThisThing()方法并进入其自己的循环。
那么,如果我只是关闭应用程序,那么此任务会怎样?它会结束吗?它会永远持续下去吗?它会持续进行一点直到垃圾收集得到它吗?有没有办法知道应用程序结束了?
我用谷歌搜索,但没有一个简单的答案,我觉得肯定有一个答案。
作为实现细节,此任务很可能被安排为在线程池线程上执行。
如果在流程退出开始时任务尚未开始,则将其排在第一位并不重要。
如果该任务当前正在执行,则根据Windows上进程关闭的一些实现细节,最终将仅执行一个线程,而该线程不会执行该任务。因此,在这种情况下将被强制终止。
如果任务已经完成执行,无论是通过完成还是通过引发异常,则该线程都不会占用任何线程。但是,如果未观察到异常,则终结器(如果有机会执行)将抛出该异常。请注意,终结器也不保证在任何情况下都能执行。
This page should have been visible, but Microsoft's latest screw up in revoking access to old MSDN blogs continues.
Similarly, if you can manage to track the first link on this page then do so and read it.
P.S.: Here's the link for Raymond's blog. What you'll find from both sources is that only one thread continues the process shutdown.
答案取决于while循环的内容。 如果循环运行的某些逻辑完全在主程序的范围和控制之内运行,则关闭应用程序将终止所有操作。
但是,如果循环正在调用某些外部例程或操作系统功能(例如:写入文件,打开网络连接,运行命令,启动批处理作业等),则关闭应用程序不会终止所有操作。
The first question is, how this task is even executed. According to the Documentation:
每个程序都以一个线程开始,但可以进一步开始。这是主线程,GUI线程和其他一些名称。通常,如果该主线程即将结束,则它开始的所有其他线程也将被取消。这是一个操作系统级别的规则,以避免在整个地方运行具有无限循环的“僵尸线程”。
ThreadPool及其所有数据-包括托管和运行中的Threads-将由“应用程序结束”垃圾回收收集。如果不是,那么可能会有一些OS功能来确保它们也结束。但是我不想提及这些操作系统的后备,因为我们真的不应该使用它们。在某些情况下,甚至GC也无法正常运行(例如通过任务管理器杀死Programm)。
多任务和-threading的一大挑战是使主线程保持活动状态,但是如果不阻塞它,则可能发生进一步的I / O。在GUI中,您可以通过EventQueue为您完成这项工作。