Jür*_*ock 4 .net events stringwriter textwriter
我编写了一个接受a TextWriter作为参数的方法(通常是Console.Out,但不一定).
当我调用此方法时,会向TextWriter写入一些进度信息.但是,由于此方法可能会运行很长时间,我想用一些状态信息更新我的UI.
目前,我正在使用StringWriter但它没有任何事件.所以第一次从StringWriter方法完成后得到结果.
现在我正在搜索一个继承自TextWriter并触发TextChanged事件或类似事件的类.我知道这不应该是难以实现的,但我敢打赌CLR团队已经为我做了,我找不到合适的课程.
Jür*_*ock 11
如果有人感兴趣,这是一个类,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);
}
}
Run Code Online (Sandbox Code Playgroud)
现在我可以及时显示一些状态信息,而不需要等待方法完成.
void writer_Flushed(object sender, EventArgs args)
{
UpdateUi(sender.ToString());
}
Run Code Online (Sandbox Code Playgroud)
这是班级:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1283 次 |
| 最近记录: |