假设您使用一个
ThreadPool
执行一些操作,并假设每个操作都会写入文件。所有ThreadPool
的线程都是后台线程,因此当关闭应用程序时它们将被终止。如果在ThreadPool
的线程正在将文件写入磁盘时关闭应用程序,会发生什么?ThreadPool
执行一些操作,并假设每个操作都会写入文件。所有ThreadPool
的线程都是后台线程,因此当关闭应用程序时它们将被终止。如果在ThreadPool
的线程正在将文件写入磁盘时关闭应用程序,会发生什么?操作系统会在终止进程时关闭文件句柄。
请阅读 前台线程和后台线程 的MSDN文章。
线程池线程是后台线程。根据文章:
当运行时停止后台线程因为进程关闭时,线程不会抛出异常。
线程只是停止了。它执行了一条指令,但不会执行下一条。FileStream将作为CLR清理的一部分而关闭。
Environment.Exit(0)
和Environment.Exit(1)
方法(成功退出和带错误退出)轻松尝试此情况。我认为所有文件的句柄都将被移除,只有已经写入磁盘的数据将保留,而不会刷新缓冲区。
然而,在进程退出时发生错误的情况下,该文件可能会因为一些奇怪的错误变得无法访问,例如The file is being used by another process
之类的错误。
.Exit()
的参数并不重要;在这两种情况下,应用程序都会正常终止(也就是说,finally
块和 finalizers 将运行)。在你进行实验时,请尝试使用 Environment.FailFast()
,因为与 Exit()
不同,它不是一种优雅的终止方式,并且将绕过 finalizers。请注意,刷新缓冲区是可以在 finalizer 中完成的事情,但 BCL 类通常不会这样做(这很遗憾,因为操作系统无论如何都会关闭句柄,这是 finalizer 唯一的附加值)。 - Jeroen Mostert