0

Я разрабатываю приложение формы Windows, которое читает файл по строке [В фоновом рабочем потоке] и заполняет datagridview [используя BeginInvoke]. Хотя это делается, пользовательский интерфейс становится невосприимчивым (невозможно отменить/выйти или перетащить окно), но я могу видеть обновленный datagridview. Я знаю, что это связано с тем, что сообщения перекачиваются в очередь сообщений, которые имеют более высокий приоритет, чем сообщения ввода пользователя.UI не реагирует во время частых обновлений из рабочего фона

Есть ли способ, с помощью которого пользовательский интерфейс все еще может реагировать на ввод пользователя?

+0

Вы можете разместить более подробную информацию о Вашей анкете? Как фрагмент кода или что-то еще? –

ответ

2

Поскольку вы используете BeginInvoke, вы делаете что-то в потоке пользовательского интерфейса. Если вы читаете строку за строкой и добавляете каждую строку по одному, это не помогает иметь фонового работника.

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

+0

Данные довольно огромные (50 000 + записей), поэтому пользователь должен иметь возможность видеть прогресс при импорте данных. Также чтение выполняется в фоновом потоке, BeginInvoke используется только для обновления пользовательского интерфейса. – deXter

+0

@deXter Как предложил Сами, делайте это в блоках/партиях, а не в 1 на 1. В противном случае вы просто наполните Windows Message Pump для своего приложения, чтобы все замедлялось, включая краски и мышь. – MickyD

+0

@ Micky Если я отправлю данные из рабочего фона в кусках, скажем, по 100 записей. Не будет ли он повесить поток пользовательского интерфейса, пока эти 100 записей будут заполнены в datagridview. – deXter

0

Попробуйте использовать библиотеку задач, а не идти с BackgroundWorker (Task в любое время лучше, чем BackgroundWorker), ниже фрагмент кода может помочь

CancellationTokenSource tokenSource2 = new CancellationTokenSource(); 
    CancellationToken ct; 
    public MainWindowViewModel() 
    {  

     ct = tokenSource2.Token; 
     Task.Factory.StartNew(PopulateDataGrid, ct); 
    } 

    /// <summary> 
    /// 
    /// </summary> 
    private void PopulateDataGrid() 
    {   
     for (int i = 1; i < 10000; i++) 
     { 
      if (!ct.IsCancellationRequested) 
      { 

       ///Populate Your Control here     
      } 
      else 
      { 
       break; 
      } 
     } 
    } 

    public void OnCancelCLick() 
    { 
     tokenSource2.Cancel(); 
    } 
} 
Смежные вопросы