テキストが書かれている場合にイベントを発射するテキストライターの子クラスはありますか?

StackOverflow https://stackoverflow.com/questions/3708454

質問

私はaを受け入れる方法を書きました TextWriter 引数として(通常はconsole.outですが、必ずしもそうではありません)。

この方法を呼び出すと、いくつかの進捗情報がTextWriterに書き込まれます。ただし、この方法は長い間実行される可能性があるため、いくつかのステータス情報でUIを更新したいと思います。

現在、私はaを使用しています 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