Одна часть потока найдет файлы, которые соответствуют условию. Для обновления 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, просто образец каждую секунду.
Что бы вы мне предложили сделать? Какое решение является лучшей практикой?