.net - 如果写入文本,是否有一个 TextWriter 子类会触发事件?

标签 .net events stringwriter textwriter

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

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

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

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

最佳答案

如果有人感兴趣,这是一个扩展 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());
}

这是类(class):
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();
    }
}

关于.net - 如果写入文本,是否有一个 TextWriter 子类会触发事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3708454/

相关文章:

c# - 使用 Entity Framework 选择多个列

c# - 在 .NET 中自定义 TrackBar 控件

javascript - 确定给定的 JavaScript 操作是否已由用户启动

java - 使用 JAXB 将 XML 子内部节点从 XML 拉到 Java 对象

java - 从 StringWriter 写入 txt 文件

.net - 如何选择一个开源项目加入?

.net - WPF - 数据绑定(bind)到同一控件的属性

c# - 在 C# 扩展方法中订阅事件是不好的做法吗?

javascript - html: 从 onclick 属性访问鼠标事件

C#逐行读取文本文件并编辑特定行