【问题标题】:WPF TextBox binding to StringBuilder to simulate Console PerformanceWPF TextBox 绑定到 StringBuilder 以模拟控制台性能
【发布时间】: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


【解决方案1】:

由于这都是假设,我会尽我所能回答。

  1. 控制台不是string,也不是StringBuilder,它实际上是一个缓冲区,一个多维数组char(术语使用松散)。

  2. TextBox字符串 支持。

  3. StringBuilderchar一维数组,可以用ToString() 转换为string

因此,使用chars无尽 流更新string 迟早会触底。意思是,在某些时候,您将在TextBox 上喷出无穷无尽的字符,而这些字符没有 的概念。

如果你想让这个更现实,也许你想要Listarray 而不是string,但这会产生问题。但是,这样做可以让您至少缓冲一定数量的数据,或者至少以某种方式虚拟化它。

另外,你无法克服这里的分配,每次你对一个字符串做某事时,你都会再次分配。

然后你说绑定...绑定不会帮助分配

要回答您的问题,您需要向自己提出更多问题。您可以可视化数据的最佳方式是什么,您可以虚拟化它吗,您将如何处理

对于一个简单的练习,textbox 和你正在做的事情很好。然而,在此之上提出任何其他建议都非常困难且过于宽泛。

【讨论】:

  • 感谢您的洞察力。我想过使用ListListBox,这可以让它变得更好。但我猜想,所有这些信息如何存储在实际进程内存中会出现一个新问题(不像实际控制台,输出一旦进入控制台就会离开进程的内存空间)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-03
  • 1970-01-01
  • 2011-05-25
  • 1970-01-01
  • 2018-11-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多