Привязка TextBox WPF к StringBuilder для имитации производительности консоли - PullRequest
1 голос
/ 14 мая 2019

Поэтому я хочу перенаправить вывод моей консоли в TextBox для имитации консоли в графическом интерфейсе. Теперь я увидел этот пост:

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, поскольку теперь мы не будем использовать строку concat каждый раз.

Есть ли способ привязать TextBox Text непосредственно к StringBuilder? То есть добавление или сброс StringBuilder будет автоматически отражаться в графическом интерфейсе?

Если это невозможно для TextBox, есть ли другой способ обойти это?

Наконец, есть ли способ улучшить производительность кода выше?

1 Ответ

3 голосов
/ 14 мая 2019

Так как это все гипотетически, дурной ответ, что я могу.

  1. Консоль не является string или StringBuilder, на самом деле это буфер , многомерный массив char (термин используется свободно).

  2. A TextBox поддерживается строкой .

  3. A StringBuilder - это одномерный массив из char, который можно преобразовать в string с ToString()

Итак, обновление string с помощью и бесконечного потока chars рано или поздно достигнет своего пика. Это означает, что в какой-то момент вы будете разбрызгивать TextBox с бесконечным количеством символов , которые не имеют понятия строк .

Если вы хотите сделать это более реалистичным, возможно, вы хотите List или array вместо string, но это создает свои проблемы. Тем не менее, это позволит вам по крайней мере буферизовать определенное количество данных или по крайней мере виртуализировать каким-либо образом.

Кроме того, вы не можете перебрать выделения здесь, каждый раз, когда вы что-то делаете со строкой, вы выделяете снова.

Тогда вы говорите о привязке ... Связывание не поможет выделениям .

Чтобы ответить на ваши вопросы, вам нужно задать себе больше вопросов. Как наилучшим образом вы можете визуализировать данные, можете ли вы виртуализировать это, как вы собираетесь работать с строками .

Для простого упражнения textbox и то, что вы делаете, хорошо. Тем не менее, предлагать что-либо еще сверх этого чрезвычайно сложно и слишком широко.

...