C# 在WPF中使用EntityFrameWork加载数据时显示Progressbar

C# 在WPF中使用EntityFrameWork加载数据时显示Progressbar,c#,sql-server,wpf,multithreading,entity-framework,C#,Sql Server,Wpf,Multithreading,Entity Framework,我想在Progressbar中显示从数据库获取数据的进度。目前我正在更新按钮的内容。我不知道如何在这段代码中实现 private async void FetchInvoicesDataFunc(object sender, RoutedEventArgs e) { ProgressBtn.Content = "Loading Data ..."; InvoiceGrid.ItemsSource = await Task.Run(FetchInvoiceDataAsync);

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

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;
    }
}
private async void FetchInvoicesDataFunc(对象发送方,RoutedEventArgs e)
{
ProgressBtn.Content=“正在加载数据…”;
InvoiceGrid.ItemsSource=等待任务.Run(FetchInvoiceDataAsync);
ProgressBtn.Content=“已加载!”;
}
私有异步任务FetchInvoiceDataAsync()
{
列出结果;
使用(var context=new Intelliventory_DBEntities())
{  
结果=wait context.Invoices.Where(b=>b.InvoiceID x.Customer).toListSync();
}
返回结果;
}
}

您将无法显示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;
 }
private async void FetchInvoicesDataFunc(对象发送方,RoutedEventArgs e)
{
列表结果=新列表();
ProgressBtn.Content=“正在加载数据…”;
wait Task.Run(async()=>results.AddRange(wait-FetchInvoiceDataAsync(0500));
ProgressBtn.Content=“完成25%”;
wait Task.Run(async()=>results.AddRange(wait FetchInvoiceDataAsync(5011000));
ProgressBtn.Content=“完成50%”;
wait Task.Run(async()=>results.AddRange(wait FetchInvoiceDataAsync(10011500));
ProgressBtn.Content=“75%完成…”;
wait Task.Run(async()=>results.AddRange(wait FetchInvoiceDataAsync(15012000));
InvoiceGrid.ItemsSource=结果;
ProgressBtn.Content=“已加载!”;
}
专用异步任务FetchInvoiceDataAsync(int开始,int结束)
{
列出结果;
使用(var context=new Intelliventory_DBEntities())
{  
结果=wait context.Invoices.Where(b=>b.InvoiceID>=start&&b.InvoiceID x.Customer).toListSync();
}
返回结果;
}
请注意,这将对应用程序的性能产生负面影响。
关于如何在WinForms和WPF中使用progressbars,有成千上万的教程,因此我将不深入讨论该主题。

您将无法跟踪“进度”在获取大量数据时,可以考虑在多个查询中拆分查询,然后显示进度。我如何将它拆分。不知道:(是的,谢谢!它正在工作,但是每次进展都会挂起UI!我不知道如何解决这个问题:(太棒了!但当数据加载到DataGrid时,Ui仍然会挂起一秒钟。就在数据显示到DataGrid之前!在使用我的代码之前,您已经冻结了Ui,对吗?很遗憾,您无法摆脱这个小冻结。至少我不知道如何。当“InvoiceGrid.ItemsSource=results”时执行你的UI被重新绘制。这会使UI冻结,正如我已经说过的,我认为你无法摆脱它。我希望能摆脱它!但非常感谢你的帮助!谢谢兄弟:)