HtmlTextWriter在处置时不会刷新?

时间:2011-07-06 11:38:25

标签: c# dispose flush htmltextwriter

我需要写一些带样式的文本(比如颜色,字体),所以我决定使用html。我发现HtmlTextWriter是用于编写html文件的类。但是,我发现我必须手动关闭或刷新它,否则不会写入文件。为什么? (使用语句应该在块完成时处理它)

        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 个答案:

答案 0 :(得分:2)

这是HtmlTextWriter中的错误。您应该创建一个独立的测试用例report it using Microsoft Connect。似乎CloseDispose表现不同,没有记录,并且非常不寻常。我也找不到MSDN上的任何文件,说明HtmlTextWriter takes ownership of the underlying textwriter是否;即它会处置基础文本编写者还是你必须?

编辑2: HtmlTextWriter上的MSDN页面声明它继承(而不是覆盖)虚拟Dispose(bool)方法。这意味着当前的实现显然不能使用using块进行清理。作为解决方法,请尝试以下方法:

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而不包含BOM。

祝你好运 - 别忘了report the bug

答案 1 :(得分:0)

您不需要在using语句中使用try {} Finally {}块,因为这将为您处理该对象。

答案 2 :(得分:0)

我怀疑原因是HtmlTextWriter没有为TextWriter的protected virtual void Dispose( bool disposing )方法提供覆盖来调用Close()所以,你是对的,你需要自己做 - TextWriter的实现是空的。正如方面所指出的那样,您不需要try finally语句中的using块。正如Eamon Nerbonne指出的那样,这肯定是一个框架错误。