代码之家  ›  专栏  ›  技术社区  ›  Jürgen Steinblock

是否有TextWriter子类在写入文本时触发事件?

  •  4
  • Jürgen Steinblock  · 技术社区  · 14 年前

    TextWriter 作为论据(通常控制台。出去,但不一定)。

    当我调用此方法时,一些进度信息会写入TextWriter。

    目前,我正在使用 StringWriter 但它没有任何事件。所以我第一次从 是在方法完成之后。

    现在我正在搜索从 文本编写器 我知道这应该不难实现,但我敢打赌CLR团队已经为我做了,我只是找不到合适的类。

    2 回复  |  直到 14 年前
        1
  •  14
  •   Jürgen Steinblock    14 年前

    如果有人感兴趣,这是一个扩展 StringWriter() writer.Flush() .

    我还添加了自动调用 Flush() 在每次写入之后,因为在我的例子中,第三方组件确实写入了控制台,但没有执行刷新。

    void DoIt()
    {
        var writer = new StringWriterExt(true); // true = AutoFlush
        writer.Flushed += new StringWriterExt.FlushedEventHandler(writer_Flushed);
    
        TextWriter stdout = Console.Out;
        try
        {
            Console.SetOut(writer);
            CallLongRunningMethodThatDumpsInfoOnConsole();
        }
        finally
        {
            Console.SetOut(stdout);
        }
    }
    

    现在我可以及时显示一些状态信息,不需要等待方法完成。

    void writer_Flushed(object sender, EventArgs args)
    {
        UpdateUi(sender.ToString());
    }
    

    下面是课程:

    public class StringWriterExt : StringWriter
    {
        [EditorBrowsable(EditorBrowsableState.Never)]
        public delegate void FlushedEventHandler(object sender, EventArgs args);
        public event FlushedEventHandler Flushed;
        public virtual bool AutoFlush { get; set; }
    
        public StringWriterExt()
            : base() { }
    
        public StringWriterExt(bool autoFlush)
            : base() { this.AutoFlush = autoFlush; }
    
        protected void OnFlush()
        {
            var eh = Flushed;
            if (eh != null)
                eh(this, EventArgs.Empty);
        }
    
        public override void Flush()
        {
            base.Flush();
            OnFlush();
        }
    
        public override void Write(char value)
        {
            base.Write(value);
            if (AutoFlush) Flush();
        }
    
        public override void Write(string value)
        {
            base.Write(value);
            if (AutoFlush) Flush();
        }
    
        public override void Write(char[] buffer, int index, int count)
        {
            base.Write(buffer, index, count);
            if (AutoFlush) Flush();
        }
    }
    
        2
  •  2
  •   Steven    14 年前

    在BCL中没有这样的东西,但是正如您已经注意到的,这并不难实现。

    祝你好运。