HtmlTextWriter не сбрасывается при утилизации?

Мне нужно написать текст со стилем (например, цвет, шрифты), поэтому я решил использовать HTML. я нашел это HtmlTextWriter это класс, используемый для написания HTML-файла. Однако я обнаружил, что должен вручную закрыть или очистить его, иначе ничего не будет записано в файл. Почему это? (оператор using должен располагать его после завершения блока)

        using (HtmlTextWriter htmlWriter = new HtmlTextWriter(new StreamWriter(
            Path.Combine(EmotionWordCounts.FileLocations.InputDirectory.FullName, fileName),
            false, Encoding.UTF8)))
        {
            try
            {

                htmlWriter.WriteFullBeginTag("html");
                htmlWriter.WriteLine();
                htmlWriter.Indent++;

                htmlWriter.WriteFullBeginTag("body");
                htmlWriter.WriteLine();
                htmlWriter.Indent++;

                // write something using WriteFullBeginTag and WriteEndTag
                // ...

            } //try
            finally
            {
                htmlWriter.Indent--;
                htmlWriter.WriteEndTag("body");
                htmlWriter.WriteLine();

                htmlWriter.Indent--;
                htmlWriter.WriteEndTag("html");
                htmlWriter.Close(); // without this, the writer doesn't flush
            }
        } //using htmlwriter

Заранее спасибо.

3 ответа

Решение

Это ошибка в HtmlTextWriter, Вы должны сделать отдельный тестовый пример и сообщить о нем с помощью Microsoft Connect. Кажется, что Close а также Dispose вести себя по-другому, что не задокументировано и крайне необычно. Я также не могу найти какую-либо документацию по MSDN, указывающую, принимает ли HtmlTextWriter право собственности на основной текстовый редактор или нет; т.е. будет ли он располагать основным автором текста или вы должны?

Изменить 2: страница MSDN наHtmlTextWriter утверждает, что он наследует (в отличие от переопределений) виртуальный Dispose(bool) метод. Это означает, что текущая реализация явно не может очиститься с использованием блока. В качестве обходного пути попробуйте это:

using(var writer = ...make TextWriter...) 
using(var htmlWriter = new HtmlTextWriter(writer)) {

    //use htmlWriter here...

} //this should flush the underlying writer AND the HtmlTextWriter

// although there's currently no need to dispose HtmlTextWriter since
// that doesn't do anything; it's possibly better to do so anyhow in 
// case the implementation gets fixed

Между прочим, new StreamWriter(XYZ, false, Encoding.UTF8) эквивалентно new StreamWriter(XYZ), StreamWriter создает, а не добавляет по умолчанию, а также по умолчанию использует UTF8 без спецификации.

Удачи - и не забудьте сообщить об ошибке!

Вам не нужно иметь блок try{} finally {} в операторе using, поскольку это избавит вас от объекта.

Я подозреваю, что причина в том, что HtmlTextWriter не обеспечивает переопределение для TextWriter protected virtual void Dispose( bool disposing ) метод для вызова Close() Итак, вы правы, вам нужно сделать это самостоятельно - реализация TextWriter пуста. Как указал аспект, вам не нужно try finally блок в пределах using заявление хотя. Как отметил Имон Нербонн, это, безусловно, ошибка в структуре.

Другие вопросы по тегам