【问题标题】:Show Progressbar when loading data using EntityFrameWork in WPF在 WPF 中使用 EntityFrameWork 加载数据时显示进度条
【发布时间】:2018-08-21 18:17:33
【问题描述】:

我想在Progressbar 中显示从数据库中获取数据的进度。目前我正在更新Button 的内容。不知道如何在这段代码中实现。

private async void FetchInvoicesDataFunc(object sender, RoutedEventArgs e)
 {
   ProgressBtn.Content = "Loading Data ...";
   InvoiceGrid.ItemsSource = await  Task.Run(FetchInvoiceDataAsync);
   ProgressBtn.Content = "Loaded !";

 }

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

【问题讨论】:

  • 您将无法跟踪查询的“进度”,至少不能以百分比的形式跟踪。当获取大量数据时,您可以考虑将查询拆分为多个查询,然后显示进度。
  • 如何拆分。不知道:(

标签: c# sql-server wpf multithreading entity-framework


【解决方案1】:

您将无法显示 EF 查询的百分比,因为它不会通知您数据库查询的进度(我不知道有任何数据库系统可以让客户了解查询的状态)

您可以考虑将您的查询拆分成这样的部分:

 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;
 }

请注意,这将对您的应用程序的性能产生负面影响。 有成千上万的教程如何在 WinForms 和 WPF 中使用进度条,所以我不会深入探讨这个话题。

【讨论】:

  • 是的,谢谢!它正在工作,但每次取得进展时 UI 都会挂起!我不知道如何解决这个问题:(
  • 太棒了!但是当 Data 加载到 DataGrid 时,Ui 仍然挂起一秒钟。就在数据显示到 DataGrid 之前!
  • 在使用我的代码之前,您已经冻结了 UI,对吧?不幸的是,您将无法摆脱这种小冻结。至少我不知道该怎么做。当“InvoiceGrid.ItemsSource = results”执行时,您的 UI 将被重绘。这会使 UI 冻结,正如我已经说过的,我认为您无法摆脱它。
  • 我希望能摆脱这个!但真的很感谢你的帮助!谢谢兄弟:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-02
  • 2011-06-19
  • 1970-01-01
相关资源
最近更新 更多