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

.net 是否有TextWriter子类在写入文本时触发事件?,.net,events,stringwriter,textwriter,.net,Events,Stringwriter,Textwriter,我已经编写了一个方法,它接受TextWriter作为参数(通常是Console.Out,但不一定) 当我调用此方法时,一些进度信息会写入TextWriter。 但是,由于此方法可能会运行很长时间,因此我想用一些状态信息更新UI 目前,我使用的是StringWriter,但它没有任何事件。因此,我第一次从StringWriter获得结果是在方法完成之后 现在我正在搜索一个类,该类继承自TextWriter,并触发TextChanged事件或类似事件。 我知道这应该不难实现,但我打赌CLR团队已经为

我已经编写了一个方法,它接受
TextWriter
作为参数(通常是Console.Out,但不一定)

当我调用此方法时,一些进度信息会写入TextWriter。 但是,由于此方法可能会运行很长时间,因此我想用一些状态信息更新UI

目前,我使用的是
StringWriter
,但它没有任何事件。因此,我第一次从
StringWriter
获得结果是在方法完成之后

现在我正在搜索一个类,该类继承自
TextWriter
,并触发TextChanged事件或类似事件。
我知道这应该不难实现,但我打赌CLR团队已经为我做了,我只是找不到合适的类。

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


祝你好运。

如果有人感兴趣,这是一个扩展
StringWriter()
类的类,可以在每次调用
writer.Flush()
后触发事件

我还添加了在每次写入后自动调用
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();
    }
}

在我的例子中,我需要在每次刷新后清除StringWriter缓冲区。我添加了这个.GetStringBuilder().Clear();到OnFlush()方法的末尾。