У меня проблема с 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
по назначению. В любом случае вы выполняете всю свою работу надDispatcher
, что полностью противоречит целиBackgroundWorker
. То, как вы получаете доступ к своим элементам сетки данных, также совершенно не нужно. У вас есть коллекция элементов, которые вы привязываете к своей сетке данных? Что делаетCheckExist2
? Есть ли шанс, что вы сможете создать методы для своегоZegrisReadToDB
классаasync
? - person the.Doc   schedule 17.06.2020