У меня есть программа, которая читает некоторые данные, затем создает большой набор данных на основе этого и, наконец, экспортирует этот набор данных в файл .csv.Поскольку генерация таблицы занимает довольно много времени, я создал фонового работника, который должен отображаться в списке на моей главной форме, где находится программа.
Ниже приведена сводная информация о моем коде:
private readonly BackgroundWorker worker = new BackgroundWorker();
public void get_data()
{
worker.DoWork += worker_DoWork;
worker.RunWorkerCompleted += worker_RunWorkerCompleted;
worker.ProgressChanged += worker_ProgressChanged;
worker.WorkerReportsProgress = true;
worker.RunWorkerAsync();
}
private void worker_DoWork(object sender, DoWorkEventArgs e)
{
worker.ReportProgress(1, "Starting");
mydata = read_file();
worker.ReportProgress(1, "Step 1 done!");
fullmodel = combine_data(mydata);
worker.ReportProgress(1, "Step 2 done!");
DataTableToCSV(fullmodel, ';');
}
private void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
MainWindow.listBox.Items.Add(e.UserState);
}
private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
}
Это прекрасно работает, когда я запускаю свою программу в режиме отладки VS2015, «Запуск», «Шаг 1 выполнен!»и "Шаг 2 сделан!"появляются в списке, когда они должны.Однако, когда я запускаю приложение вне Visual Studio, событие ProgressChanged, похоже, срабатывает только один раз - «Запуск» отображается в списке, как и ожидалось, но только после того, как фоновый работник завершил работу, остальные две записи должны быть сообщены, пока оновыполняющиеся сразу отображаются в списке, а пользовательский интерфейс останавливается во время работы программы.