2015-02-19 3 views
3

Предположим, вы используете ThreadPool для выполнения некоторых операций и предположите, что каждая операция записывается в файл. Все темы из ThreadPool являются фоновыми потоками, поэтому они будут прекращены при закрытии приложения. Что произойдет, если приложение закрыто, а поток ThreadPool записывает файл на диск?Что произойдет, если приложение закрыто, когда поток ThreadPool записывает файл?

+0

Он закроет дескриптор файла в файл и прекратит писать его, возможно, закончив поврежденное состояние файла. Вы пытались это сделать? –

+2

Я должен проверить, что происходит, написав большой файл. – enzom83

+2

Результат, скорее всего, зависит от используемой FileSystem. FAT Покажет другие результаты, кроме NTFS. – TGlatzer

ответ

6

Операционная система закрывает дескриптор файла как часть завершения процесса.

  • Любой ожидающий асинхронный ввод/вывод будет отменен
  • Любых данные в буфере записи, который не очищаются теряется
3

Читать статью MSDN на Foreground and Background threads

Threadpool нитях фоновые потоки. Из статьи:

Когда среда выполнения останавливает фоновый поток, так как процесс завершается, исключение не генерируется в потоке.

Нить просто останавливается. Он выполняет одну команду и никогда не выполняет следующую команду. FileStream будет закрыт как часть очистки CLR.

+0

CLR не закрывает файлы. Это делает базовая операционная система. –

+0

Если процесс изящно завершается, тогда будут вызываться финализаторы: см. Http://blog.stephencleary.com/2009/08/finalizers-at-process-exit.html. Финализатор FileStream закрывает основной дескриптор файла. – canton7

+0

Финализаторы будут называться частью сбора мусора только тогда, когда экземпляр недоступен. Почему 'FileStream' недоступен, когда поток ThreadPool' пишет с ним? –

2

Вы можете легко решить эту проблему, вызвав метод Environment.Exit(0) и Environment.Exit(1) (успешный выход и выход с ошибкой). Я думаю, что все дескрипторы файла будут удалены, и только данные, уже записанные на диск, останутся без очистки буферов.

Althrough, файл может стать недоступным с некоторой странной ошибкой, например The file is being used by another process или что-то в случае ошибки, выходящей из процесса.

+2

Аргумент, который вы передаете '.Exit()', не имеет значения; в обоих случаях приложение заканчивается изящно (что означает «finally» -блоки и финализаторы). Пока вы экспериментируете, попробуйте ['Environment.FailFast()'] (https://msdn.microsoft.com/library/system.environment.failfast), поскольку это, в отличие от 'Exit()', не является изящным завершение и обход финализаторов. Обратите внимание, что буферы для очистки - это что-то, что * можно было бы сделать * в финализаторе, но классы BCL обычно не работают (что является позором, поскольку ОС закрывает дескрипторы в любом случае, и это единственное добавленное значение, которое имеет финализатор). –

Смежные вопросы