如果在 ThreadPool 的线程正在写入文件时应用程序关闭,会发生什么情况?
What happens if an application is closed while a thread of ThreadPool is writing a file?
假设您使用ThreadPool
执行一些操作,并假设每个操作都写入一个文件。 ThreadPool
的所有线程都是后台线程,所以在关闭应用的时候会被终止。如果在 ThreadPool
的线程正在将文件写入磁盘时关闭应用程序会发生什么情况?
操作系统将关闭文件句柄作为终止进程的一部分。
- 任何挂起的异步I/O将被取消
- 写入缓冲区中未刷新的任何数据都会丢失
阅读有关 Foreground and Background threads
的 MSDN 文章
ThreadPool 线程是后台线程。来自文章:
When the runtime stops a background thread because the process is shutting down, no exception is thrown in the thread.
线程只是停止了。它执行一条指令,从不执行下一条。 FileStream 将作为 CLR 清理的一部分关闭。
您可以通过调用Environment.Exit(0)
and Environment.Exit(1)
方法轻松尝试这种情况(成功退出和错误退出)。我认为文件的所有句柄都将被删除,并且只保留已写入磁盘的数据,而不会刷新缓冲区。
自始至终,该文件可能会因一些奇怪的错误而变得无法访问,例如 The file is being used by another process
或在退出进程时出现错误的情况。
假设您使用ThreadPool
执行一些操作,并假设每个操作都写入一个文件。 ThreadPool
的所有线程都是后台线程,所以在关闭应用的时候会被终止。如果在 ThreadPool
的线程正在将文件写入磁盘时关闭应用程序会发生什么情况?
操作系统将关闭文件句柄作为终止进程的一部分。
- 任何挂起的异步I/O将被取消
- 写入缓冲区中未刷新的任何数据都会丢失
阅读有关 Foreground and Background threads
的 MSDN 文章ThreadPool 线程是后台线程。来自文章:
When the runtime stops a background thread because the process is shutting down, no exception is thrown in the thread.
线程只是停止了。它执行一条指令,从不执行下一条。 FileStream 将作为 CLR 清理的一部分关闭。
您可以通过调用Environment.Exit(0)
and Environment.Exit(1)
方法轻松尝试这种情况(成功退出和错误退出)。我认为文件的所有句柄都将被删除,并且只保留已写入磁盘的数据,而不会刷新缓冲区。
自始至终,该文件可能会因一些奇怪的错误而变得无法访问,例如 The file is being used by another process
或在退出进程时出现错误的情况。