Предположим, вы используете ThreadPool
для выполнения некоторых операций и предположите, что каждая операция записывается в файл. Все темы из ThreadPool
являются фоновыми потоками, поэтому они будут прекращены при закрытии приложения. Что произойдет, если приложение закрыто, а поток ThreadPool
записывает файл на диск?Что произойдет, если приложение закрыто, когда поток ThreadPool записывает файл?
ответ
Операционная система закрывает дескриптор файла как часть завершения процесса.
- Любой ожидающий асинхронный ввод/вывод будет отменен
- Любых данные в буфере записи, который не очищаются теряется
Читать статью MSDN на Foreground and Background threads
Threadpool нитях фоновые потоки. Из статьи:
Когда среда выполнения останавливает фоновый поток, так как процесс завершается, исключение не генерируется в потоке.
Нить просто останавливается. Он выполняет одну команду и никогда не выполняет следующую команду. FileStream будет закрыт как часть очистки CLR.
CLR не закрывает файлы. Это делает базовая операционная система. –
Если процесс изящно завершается, тогда будут вызываться финализаторы: см. Http://blog.stephencleary.com/2009/08/finalizers-at-process-exit.html. Финализатор FileStream закрывает основной дескриптор файла. – canton7
Финализаторы будут называться частью сбора мусора только тогда, когда экземпляр недоступен. Почему 'FileStream' недоступен, когда поток ThreadPool' пишет с ним? –
Вы можете легко решить эту проблему, вызвав метод Environment.Exit(0)
и Environment.Exit(1)
(успешный выход и выход с ошибкой). Я думаю, что все дескрипторы файла будут удалены, и только данные, уже записанные на диск, останутся без очистки буферов.
Althrough, файл может стать недоступным с некоторой странной ошибкой, например The file is being used by another process
или что-то в случае ошибки, выходящей из процесса.
Аргумент, который вы передаете '.Exit()', не имеет значения; в обоих случаях приложение заканчивается изящно (что означает «finally» -блоки и финализаторы). Пока вы экспериментируете, попробуйте ['Environment.FailFast()'] (https://msdn.microsoft.com/library/system.environment.failfast), поскольку это, в отличие от 'Exit()', не является изящным завершение и обход финализаторов. Обратите внимание, что буферы для очистки - это что-то, что * можно было бы сделать * в финализаторе, но классы BCL обычно не работают (что является позором, поскольку ОС закрывает дескрипторы в любом случае, и это единственное добавленное значение, которое имеет финализатор). –
- 1. Что происходит, если поток ThreadPool умирает?
- 2. Что произойдет, если входной поток отправлен в выходной поток?
- 3. sharedpreferences остается, когда приложение закрыто
- 4. Как удалить файл, когда приложение закрыто
- 5. Что произойдет, если поток сбой, который лучше нить или процесс?
- 6. Что произойдет, когда make-файл самостоятельно отредактирует?
- 7. Когда ThreadPool выделяет поток для экземпляра Backgroundworker?
- 8. Сервис прекращается, когда приложение закрыто.
- 9. Что произойдет, если файл не существует
- 10. Что произойдет, если поток в критической секции затухает?
- 11. UILocalNotification когда приложение закрыто
- 12. Что произойдет, если основной поток занят, когда рабочий поток отправляет сообщение?
- 13. обнаружить, когда приложение закрыто
- 14. сигнализации, когда приложение закрыто
- 15. радиоприемник, когда приложение закрыто
- 16. startMonitoringForRegion, когда приложение закрыто
- 17. Push Notification Когда приложение закрыто/закрыто, включая
- 18. Что произойдет, если я создам поток в asp.net?
- 19. Что произойдет, если один поток OpenMP завершится с ошибкой?
- 20. Что произойдет, если action = ""?
- 21. Что произойдет, если ViewState Disabled
- 22. Что произойдет, если я удалю файл журнала Apache?
- 23. Веб-страница сигнализации, когда поток ThreadPool завершен
- 24. как сказать, если каждый поток ThreadPool ждет
- 25. При использовании задачи Что происходит, если ThreadPool заполнен/занят?
- 26. Что произойдет, если поток получит 10 реентерабельных замков и штампов?
- 27. Что произойдет, если один поток выйдет из строя в процессе?
- 28. Что произойдет, если поток выбрасывает исключение внутри синхронизированного блока
- 29. Что произойдет, если * .exe.config удален?
- 30. iBeacon Notification Когда приложение закрыто
Он закроет дескриптор файла в файл и прекратит писать его, возможно, закончив поврежденное состояние файла. Вы пытались это сделать? –
Я должен проверить, что происходит, написав большой файл. – enzom83
Результат, скорее всего, зависит от используемой FileSystem. FAT Покажет другие результаты, кроме NTFS. – TGlatzer