Я работаю над улучшением безопасности кода для исключения и понял, что повышенное значение ThreadAbortException
может привести к нежелательным утечкам ресурсов, даже при защите ресурсов с помощью конструкции C # using
. Например, рассмотрим следующий код (который может выполняться в отдельном потоке).
using (TextWriter writer = CreateWriter(filename))
{
// do something with the writer.
}
TextWriter CreateWriter(string filename)
{
return new CustomWriter(File.OpenWrite(filename));
}
Если поток, выполняющий этот код, ненормально завершен, то я бы хотел, чтобы дескриптор файла, на который ссылается filename
, был немедленно закрыт. Могу ли я сделать это, не заменяя использование конструкции using
блоком try / finally?
Я предполагаю, что ThreadAbortException
может быть поднят в любое время, что означает, что я должен обращать внимание на то, что происходит между утверждениями. Хотя я могу защититься от исключения в CreateWriter
с помощью блока try / finally, конструкция using
не будет делать то же самое до тех пор, пока не будет вычислено выражение в скобках, что означает, что файловый ресурс остается открытым в случае возникновения исключения сразу после CreateWriter
возвращается.
Я понимаю, что финализатор в конечном итоге освободит дескриптор файла, но мне интересно, есть ли детерминистский способ решения этой проблемы без перехвата ThreadAbortException
в каждом месте, где используется CreateWriter
.