加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-15 04:53:02 所属栏目:Java 来源:网络整理
导读:我编写了一个接受TextWriter作为参数的方法(通常是Console.Out,但不一定). 当我调用此方法时,会向TextWriter写入一些进度信息. 但是,由于此方法可能会运行很长时间,我想用一些状态信息更新我的UI. 目前,我使用的是StringWriter,但它没有任何事件.所以我第一
我编写了一个接受TextWriter作为参数的方法(通常是Console.Out,但不一定).

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

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

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

解决方法

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读