【发布时间】:2019-09-30 23:08:50
【问题描述】:
所以我想将我的控制台输出重定向到一个文本框来模拟 GUI 控制台。现在我看到了这个帖子:
https://stackoverflow.com/a/18727100/6871623
这有助于重定向过程。
但是,由于字符串是不可变的,这意味着每次写入都会分配一个新字符串,这不是很有效。
因此,我想到了像这样使用 StringBuilder:
public class ControlWriter : TextWriter
{
private Control textbox;
private StringBuilder builder;
public ControlWriter(Control textbox)
{
this.textbox = textbox;
builder = new StringBuilder();
}
public override void Write(char value)
{
builder.Append(value);
textbox.Text = builder.ToString();
}
public override void Write(string value)
{
builder.Append(value);
textbox.Text = builder.ToString();
}
public override Encoding Encoding
{
get { return Encoding.ASCII; }
}
}
查看代码,它似乎并没有提高性能,因为每次调用 builder.ToString() 时都会分配一个新字符串,主要是我们改进的是 Append 部分,因为现在我们不会每次都使用字符串连接。
有没有办法将 TextBox Text 直接绑定到 StringBuilder?也就是说,追加或重置StringBuilder会自动反映在GUI上?
如果 TextBox 无法做到这一点,还有其他方法可以解决这个问题吗?
最后,有没有办法提高上面代码的性能?
【问题讨论】:
-
等一下……这是 wpf 应用程序还是控制台应用程序?无论如何,除此之外,是的字符串是不可变的,文本框由沿线某处的字符串支持,您可以编辑文本框的内存以插入更多字符串吗?...不。但即使在此之前,这种低效率是如何给您带来问题的?
-
@TheGeneral 这是 WPF 但我希望将所有
Console输出重定向到自定义TextWriter。我正在这样做,但效率不高。我对此并没有真正的不便,我可以做到,但我只是想知道是否有办法让它最有效。这是为了学习。 -
答案不是真的,我的意思是,调用 ToString 时总会有分配,更新文本框时总会有分配。
-
@TheGeneral 因此无法将
Text属性直接绑定到StringBuilder的流 -
虽然绑定不会停止分配,但是当然有一种方法可以绑定,但不能绑定到没有一些奇怪而美妙的新类的字符串生成器,这不会真正取得太大成就
标签: c# wpf performance data-binding