C # Как быстро установить действительно длинную строку для TextBox? - PullRequest
0 голосов
/ 03 июля 2018

Одна часть потока найдет файлы, которые соответствуют условию. Для обновления TextBox я использую метод TextBox.AppendText(). В моем случае количество файлов составляет около 17000.

Я пытался обновить TextBox после каждого найденного файла с помощью BeginInvoke. Это привело к тому, что пользовательский интерфейс перестал отвечать, на нем ничего не появится, пока не закончится фоновый поток.

Я пытался обновить TextBox после каждого найденного файла, используя Invoke. Это, вероятно, успех при отправке данных на TextBox, и я также мог видеть, что метка, которая считает найденный файл, быстро увеличилась с 1 до 17000. Это казалось успешным, потому что я видел только 5 путей к файлам на экране. Поэтому я решил использовать метод TextBox.ScrollToEnd() всякий раз, когда TextBox обновляется. Тем не менее, после того, как метка считается до 2000, пользовательский интерфейс снова не отвечает.

Я пытался использовать RichTextBox, его поведение аналогично TextBox.

Я читал о 50мс Правиле . Тогда я понял, что причина в том, что фоновый поток работает слишком быстро, он может генерировать около 500 ~ 1000 фрагментов данных каждые 50 мс, и это очень много для пользовательского интерфейса. Это имеет смысл. Я думаю, что если пользовательский интерфейс обновляется только каждые 50 мс, то каждую секунду он обновляется 20 раз, и наш экран работает на частоте 30 Гц. Я знал, что я был не прав.

Наконец, я попытался создать другой поток, который имел бы только бесконечный цикл. Внутри этого цикла находится метод Thread.Sleep(50), за которым следует команда для активации события, которое вызывает обновление пользовательского интерфейса. Чтобы сделать это, я должен использовать объект StringBuilder для объединения многих путей к файлам, а затем отправить его в TextBox при запуске события.

Но есть еще проблема. Как я уже говорил, поток может находить 500 ~ 1000 путей к файлам каждые 50 мс, и каждый путь имеет длину около 100 символов. Теперь TextBox не имеет дело со временем, но он должен иметь дело с длиной. Для добавления строки длиной 50 000 символов потребуется более 50 мс, поэтому в результате пользовательский интерфейс по-прежнему не отвечает.

Итак, мой вопрос: как мне очень быстро установить строку длиной 50 000 символов в TextBox?

Прямо сейчас я могу думать только об одном оставленном варианте. То есть я бы не показывал все в UI, просто образец каждую секунду.

Что бы вы мне предложили сделать? Какое решение является лучшей практикой?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...