Зависание пользовательского интерфейса WPF при загрузке данных в DatagGrid - PullRequest
0 голосов
/ 27 августа 2018

Асинхронная загрузка данных и на протяжении всего процесса пользовательский интерфейс реагирует. Но когда эта строка InvoiceGrid.ItemsSource = results; выполняет, пользовательский интерфейс останавливается на секунду или более в зависимости от размера данных. Есть ли способ избавиться от этого зависания пользовательского интерфейса?

private async void FetchInvoicesDataFunc(object sender, RoutedEventArgs  e)

 {
   List<Invoice> results = new List<Invoice>();
   ProgressBtn.Content = "Loading Data ...";
   await Task.Run(async() => results.AddRange(await FetchInvoiceDataAsync(0, 500));  
   ProgressBtn.Content = "25% done...";
   await Task.Run(async() => results.AddRange(await FetchInvoiceDataAsync(501, 1000)); 
   ProgressBtn.Content = "50% done...";
   await Task.Run(async() => results.AddRange(await FetchInvoiceDataAsync(1001, 1500)); 
   ProgressBtn.Content = "75% done...";
   await Task.Run(async() => results.AddRange(await FetchInvoiceDataAsync(1501, 2000));        
   InvoiceGrid.ItemsSource = results;
   ProgressBtn.Content = "Loaded !";    
 }

 private async Task<List<Invoice>> FetchInvoiceDataAsync(int start, int end)
 {
   List<Invoice> result;
   using(var context = new Intelliventory_DBEntities() )
   {  
     result  = await context.Invoices.Where(b => b.InvoiceID >= start && b.InvoiceID <= end).Include(x => x.Customer).ToListAsync();      
   }

   return  result;
 }

1 Ответ

0 голосов
/ 28 августа 2018

Он зависает, потому что вы пытаетесь обновить ProgressBtn, который является элементом управления пользовательского интерфейса из вашего асинхронного метода. Не уверен, что вы вызываете этот метод из фонового потока. Если бы я сделал это, я бы ввел обратный вызов в методе FetchInvoiceDataAsync () для обновления элемента управления ProgressBtn. В этом методе обратного вызова я бы вызвал диспетчер для обновления пользовательского интерфейса. Это должно решить все проблемы с замораживанием.

Application.Current.Dispatcher.Invoke(() =>
 {
      // Set property or change UI compomponents.              
 }); 

Помимо этого, я бы также рекомендовал использовать ListCollectionView вместо наблюдаемой коллекции. Это гарантирует, что вы можете обновить пользовательский интерфейс, вызывая обновление каждый раз, когда у вас есть новые дополнения к списку. Надеюсь, это поможет!

...