我对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);
}
});
}
}
ProgressChanged
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
类,则可以使该异步是有益的。以下是使用异步/等待的版本
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;
}
}