ProgressChanged 不更新进度条
ProgressChanged not updating progressbar
我对 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);
}
如您所见,我已经尝试了在该论坛上找到的几个解决方案,但 none 似乎行得通。
这是我第一次使用 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
class,那么如果可以的话,将此异步化将是有益的。下面是一个使用 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;
}
}
我对 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);
}
如您所见,我已经尝试了在该论坛上找到的几个解决方案,但 none 似乎行得通。 这是我第一次使用 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
class,那么如果可以的话,将此异步化将是有益的。下面是一个使用 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;
}
}