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

时间:2010-09-14 11:36:10

标签: .net events stringwriter textwriter

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

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

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

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

2 个答案:

答案 0 :(得分:9)

如果有人感兴趣,这是一个将StringWriter()课程扩展到每次调用writer.Flush()后触发事件的课程。

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

答案 1 :(得分:3)

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

祝你好运。