我写了一种接受A的方法 TextWriter 作为一个论点(通常是console.out,但不一定是)。

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

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

现在我正在寻找一个继承的课程 TextWriter 并发射文本变化的事件或类似的事件。我知道这不应该很难实施,但是我敢打赌,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();
    }
}

其他提示

BCL中没有这样的事情,但是正如您已经注意到的那样,这并不难实施。

祝你好运。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top