gpt4 book ai didi

.net - 如果写入文本,是否有一个 TextWriter 子类会触发事件?

转载 作者:行者123 更新时间:2023-12-04 22:08:25 24 4
gpt4 key购买 nike

我写了一个接受 TextWriter 的方法作为参数(通常是 Console.Out,但不一定)。

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

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

现在我正在寻找一个继承自 TextWriter 的类。并触发 TextChanged 事件或类似事件。
我知道这不应该很难实现,但我敢打赌 CLR 团队已经为我做了,我只是找不到合适的类。

最佳答案

如果有人感兴趣,这是一个扩展 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());
}

这是类(class):
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();
}
}

关于.net - 如果写入文本,是否有一个 TextWriter 子类会触发事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3708454/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com