] Является ли C # безопасным для прерывания инструкции using?

Я только что закончил читать "C # 4.0 in a Nutshell" (О'Рейли), и я думаю, что это отличная книга для программиста, желающего перейти на C #, но она осталась мне интересно. Моя проблема - это определение с использованием оператора . Согласно книге (стр. 138),

using (StreamReader reader = File.OpenText("file.txt")) {
    ...
}

в точности эквивалентно:

StreamReader reader = File.OpenText("file.txt");
try {
    ...
} finally {
    if (reader != null)
        ((IDisposable)reader).Dispose();
}

Предположим, однако, что это правда и что этот код выполняется в отдельном потоке. Этот поток теперь прерывается с помощью thread.Abort () , поэтому возникает исключение ThreadAbortException , и предположим, что поток находится точно после инициализации считывателя и до входа в попытку ... наконец пункт. Это означало бы, что читатель не настроен!

Возможным решением было бы закодировать следующим образом:

StreamReader reader = null;
try {
    reader = File.OpenText("file.txt");
    ...
} finally {
    if (reader != null)
        ((IDisposable)reader).Dispose();
}

Это было бы безопасным для прерывания.

Теперь к моим вопросам:

  1. Правы ли авторы книги и оператор using не является безопасным для прерывания или они неверны и ведут себя так же, как и в моем втором решении?
  2. Если using эквивалентно первому варианту (не безопасному для прерывания ), почему он проверяет null в , наконец, ?
  3. Согласно книге (стр. 856), ThreadAbortException может возникать в любом месте управляемого кода. Но, может быть, есть исключения, и первый вариант в конце концов безопасен для прерывания?

РЕДАКТИРОВАТЬ: Я знаю, что использование thread.Abort () не считается хорошей практикой. Мой интерес носит чисто теоретический характер: как оператор using ведет себя точно ?

28
задан DzinX 13 October 2010 в 12:23
поделиться