wpf - ProgressChanged 不更新进度条
问题描述
我对 ProcessChanged 有疑问。它在代码中被触发(当我在调试器中查看时),但它不会在进度条所在的主屏幕中更新。
BackgroundWorker的初始化
private void Import_Click(object sender, RoutedEventArgs e)
{
progressbarImport.Value = 0;
int max = DatagridZegrisWeekImport.Items.Count;
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += worker_DoWork;
worker.ProgressChanged += worker_ProgressChanged;
worker.WorkerReportsProgress = true;
worker.RunWorkerCompleted += worker_RunWorkerCompleted;
worker.RunWorkerAsync();
}
工作
void worker_DoWork(object sender, DoWorkEventArgs e)
{
var manager = new ZegrisReadToDB();
int progressPercentage = 0;
int max = DatagridZegrisWeekImport.Items.Count;
for (int i = 0; i < max; i++)
{
this.Dispatcher.Invoke(() =>
{
DatagridZegrisWeekImport.SelectedIndex = i;
var selecteditem = DatagridZegrisWeekImport.SelectedItem as ZegrisWeekDataImport;
string exist = manager.CheckExist2(selecteditem.Artikelnummer, selecteditem.Jaar);
if (exist == "")
{
insert statement;
progressPercentage = Convert.ToInt32(((double)i / max) * 100);
(sender as BackgroundWorker).ReportProgress(progressPercentage);
Thread.Sleep(100);
}
else
{
update statement
progressPercentage = Convert.ToInt32(((double)i / max) * 100);
(sender as BackgroundWorker).ReportProgress(progressPercentage);
Thread.Sleep(100);
}
});
}
}
进步改变
void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
Application.Current.Dispatcher.Invoke(() =>
this.progressbarImport.Value = e.ProgressPercentage);
}
如您所见,我已经尝试了在这个论坛上找到的几个解决方案,但似乎都没有奏效。这是我第一次使用 BackgroundWorker 并且在某个地方我失去了思路。
解决方案
如果您打算使用,请BackgroundWorker
尝试以下代码
void worker_DoWork(object sender, DoWorkEventArgs e)
{
var manager = new ZegrisReadToDB();
int progressPercentage = 0;
// use the source list if you have it available, rather than casting here
List<ZegrisWeekDataImport> items = DatagridZegrisWeekImport.Items.Cast<ZegrisWeekDataImport>().ToList();
var max = items.Count;
for (int i = 0; i < max; i++)
{
var item = items[i];
string exist = manager.CheckExist2(item.Artikelnummer, item.Jaar);
if (exist == "")
{
insert statement;
progressPercentage = Convert.ToInt32(((double)i / max) * 100);
(sender as BackgroundWorker).ReportProgress(progressPercentage);
}
else
{
update statement
progressPercentage = Convert.ToInt32(((double)i / max) * 100);
(sender as BackgroundWorker).ReportProgress(progressPercentage);
}
}
}
void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
this.progressbarImport.Value = e.ProgressPercentage);
}
如果您可以控制您的ZegrisReadToDB
课程,那么如果可以的话,将其设为异步将是有益的。下面是一个使用 async/await 的版本
// bind you progress bar to this
public double Progress { get; set; } // raise property changed
// bind your datagrid to this property
public List<ZegrisWeekDataImport> Items {get;set;} = new List<ZegrisWeekDataImport>();
private async void Import_Click(object sender, RoutedEventArgs e)
{
await DoWork();
}
public async Task DoWork()
{
for (int i = 0; i < Items.Count; i++)
{
var item = Items[i];
string exist = await manager.CheckExist2(item.Artikelnummer, item.Jaar);
if (exist == "")
{
await insert statement
}
else
{
await update statement
}
Progress = (double)i / max) * 100;
}
}
推荐阅读
- python - DeepFace 库 - 访问被拒绝并出现以下错误
- html - 如何制作在大屏幕上以最大宽度和高度显示并在小屏幕上保持其比例的响应元素
- javascript - 为什么当我更改第二个时第一个 CSS 变量会重置?自定义颜色主题
- mysql - 我想使用套接字从 MySQL 中获取数据实时数据
- r - 绘制直方图,但不知道为什么相对频率显示大于 1
- javascript - 如何在 React Beautiful DND 中获取移动对象的位置(xy 坐标)?
- docker - Erlang:docker容器内的oom
- javascript - 多边形裁剪:如何在中间裁剪两个多边形?
- c++ - C++ 错误:没有用于调用“reverse(char*&)”的匹配函数
- mongodb - 从 CSV 文件导入到 Mongo 时如何保留 Guid?