我编写了一个接受TextWriter
作为参数的方法(通常是Console.Out,但不一定)。
当我调用此方法时,会向TextWriter写入一些进度信息。 但是,由于此方法可能会运行很长时间,因此我想用一些状态信息更新我的UI。
目前,我使用的是StringWriter
,但它没有任何事件。因此,第一次从StringWriter
获得结果是在方法完成之后。
现在我正在搜索一个继承自TextWriter
的类并触发TextChanged事件或类似事件。
我知道这不应该难以实现,但我敢打赌CLR团队已经为我做了,我找不到合适的课程。
答案 0 :(得分:9)
如果有人感兴趣,这是一个将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();
}
}
答案 1 :(得分:3)
BCL中没有这样的东西,但正如你已经注意到的那样,这并不难实现。
祝你好运。