Предотвращение задержки пользовательского интерфейса при получении результатов из BackgroundWorker, .NET 3.5 - PullRequest
0 голосов
/ 25 февраля 2012

В поисках других мыслей по этому поводу я не мог придумать ничего умного.

У меня есть файл журнала, по которому пользователи могут выполнять поиск по совпадению строк. Предположительно, этот файл журнала может стать огромным, поэтому я решил запустить поиск на BackgroundWorker и вернуть массив совпадающих строк в RichTextBox на моем основном пользовательском интерфейсе.

Я сделал мой журнал около миллиона строк и позволил ему разорваться. Сначала я думал, что мой поток на самом деле не выполняется вне основного процесса, но потом я понял, что операция поиска была чрезвычайно быстрой, и он обновлял графический интерфейс, который занимал более 10 секунд:

if ( e->Error != nullptr )
      {
         MessageBox::Show( e->Error->Message );
      }
      else
      if ( e->Cancelled )
      {

      }
      else
      {
          try
          {
             // This is the line that kills me
             log_textBox->Lines = dynamic_cast<array<String^>^>(e->Result);
             if(log_textBox->Lines->Length == 0)
                  log_textBox->Text = "No Matches Found.";
          }
          catch(Exception^ e)
          {

          }
      }

Загрузка результирующего массива в текстовое поле - то, что замораживает мой пользовательский интерфейс. Есть ли возможность обновить пользовательский интерфейс потенциально большими объемами данных, не будучи заблокированным?

1 Ответ

0 голосов
/ 25 февраля 2012

Класс Textbox не предназначен для отображения больших объемов данных (взгляните на Блокнот).

Рассматривали ли вы использование ListView вместо VirtualMode?

...