5

aTextWriterを引数として受け入れるメソッドを作成しました (通常は Console.Out ですが、必ずしもそうとは限りません)。

このメソッドを呼び出すと、進捗情報が TextWriter に書き込まれます。ただし、このメソッドは長時間実行される可能性があるため、UI をステータス情報で更新したいと考えています。

現在、私はを使用してStringWriterいますが、イベントはありません。したがって、メソッドから初めて結果を取得するのStringWriterは、メソッドが完了した後です。

TextWriter現在、TextChanged イベントなどを継承して発生させるクラスを探しています。これを実装するのはそれほど難しいことではないことはわかっていますが、CLR チームが既に実装してくれているに違いありません。適切なクラスが見つからないだけです。

4

2 に答える 2

14

誰かが興味を持っている場合、これは、を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());
}

そしてここにクラスがあります:

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();
    }
}
于 2010-09-14T15:14:25.387 に答える
2

BCL にはそのようなものはありませんが、既にお気付きのように、これを実装するのは難しくありません。

幸運を。

于 2010-09-14T11:41:23.557 に答える