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
заявление хотя. Как отметил Имон Нербонн, это, безусловно, ошибка в структуре.