обработка большого текста в C # - PullRequest
1 голос
/ 11 ноября 2011

Я получаю 15.000 (может быть больше) строк из RichTextBox, мне нужно добавить некоторое значение в каждую строку. Какой лучший способ сделать это, чтобы программа не блокировалась?

В настоящее время я обрабатываю строки в цикле, который выполняется как поток:

 public void Process()
        {

               string[] lines;
                string line;
                string foo = " baa";
                if (richTextBox1.InvokeRequired)
                {

                    lines = (string[])Invoke((ReadLines)delegate
                    {
                        return /* read .Lines[] from richTextBox1 */
                    });
                    int max = lines.Length;

                    for (int i = 0; i < max; i++)
                    {
                        line = lines[i];
                        if (..)
                        {
                            lines[i] += "foo";
                        }
                    }

                    Invoke((Update)delegate
                    {
                        /* set new lines to RichTextBox1 */ 
                    });

              } 
       }

и затем:

Thread th1 = new Thread(Process);
 th1.Start();

но он все еще блокируется. Какой лучший способ сделать это? Заранее спасибо.

Ответы [ 3 ]

1 голос
/ 11 ноября 2011
0 голосов
/ 11 ноября 2011

Извините, но лучше всего не использовать текстовое поле, а получить компонент редактора (например, SyntaxEdit), который предназначен для частичных обновлений и обработки больших объемов текста.Пользовательский интерфейс не блокируется из-за вашей обработки, но потому, что текстовое поле просто неэффективно с большими текстами, а текстовое поле блокирует поток пользовательского интерфейса во время его обновления.Это не будет работать без переписывания.Вы, так сказать, на 14.900 строк больше, чем у него.Каждый раз, когда вы обновляете текст в поле, начинается очень медленный цикл перерисовки.Тот, который вы не можете прервать, поэтому все потоки не помогут - потому что пользовательский интерфейс не отвечает до тех пор, пока не закончится этот цикл обновления.

Есть и другие компоненты для «настоящих текстовых редакторов», которые также готовы обрабатывать гораздо больший текст.

0 голосов
/ 11 ноября 2011

Запуск в BackgroundWorker с некоторым указанием прогресса может быть вашей лучшей ставкой (если вы должны использовать RichTextBox). Даже одного из этих вращающихся изображений AJAX может быть достаточно.

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