Как сказал Марк, как только в вашем приложении появятся необработанные исключения, все ставки в значительной степени отклоняются.Чтобы выяснить, что на самом деле делает using
, он берет код, подобный следующему:
using(var myDisposableObject = GetDisposableObject()) {
// Do stuff with myDisposableObject
}
, и переводит его в нечто вроде этого:
MyDisposableObject myDisposableObject;
try {
myDisposableObject = GetDisposableObject();
// Do stuff with myDisposableObject
}
finally {
if(myDisposableObject != null) {
myDisposableObject.Dispose();
}
}
Итак, что происходит, когда ваше приложение встречаетнеобработанное исключение?Необработанное исключение приводит к прекращению работы приложения.Это завершение (или любое неожиданное завершение) может помешать правильному выполнению блока finally
из вашего оператора using
.
Вы должны всегда обрабатывать свои исключения, даже в том случае, когда вы не окружаете свой потокзвонки с try
блоками.Подумайте о подключении к событию AppDomain.UnhandledException , чтобы очистить ресурсы, журналы и т. Д. До того, как ваше приложение уничтожит пыль.
РЕДАКТИРОВАТЬ
Только что заметил, что Ганс опубликовал нечто подобное в отношении AppDomain.UnhandledException, и он прав.Это было в случае с любой программой, что неожиданные завершения могут дать неожиданные результаты.Однако в вашем случае, как уже было предложено, не полагайтесь на полное выполнение вашего приложения, особенно с файловыми ресурсами.Скорее рассмотрите возможность написания вашего процесса, чтобы предвидеть, даже ожидать, предшествующие сбои выполнения.Тогда ваше приложение может обращаться к незавершенным выполнениям по мере необходимостиВы можете создавать журналы для отслеживания хода выполнения или отметки шагов в вашем процессе и оценивать их при каждом запуске для устранения некорректных состояний выполнения.
Также, как еще одно примечание, ваши классы (даже учитывая тот факт, что они простопримеры) не являются потокобезопасными ... вы не защищаете свои общие ресурсы.