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