BackgroundWorker только сообщает о прогрессе в режиме отладки - PullRequest
0 голосов
/ 23 мая 2018

У меня есть программа, которая читает некоторые данные, затем создает большой набор данных на основе этого и, наконец, экспортирует этот набор данных в файл .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, похоже, срабатывает только один раз - «Запуск» отображается в списке, как и ожидалось, но только после того, как фоновый работник завершил работу, остальные две записи должны быть сообщены, пока оновыполняющиеся сразу отображаются в списке, а пользовательский интерфейс останавливается во время работы программы.

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

Комментарий Ханса Пассанта выше был правильным намеком.В методах, которые я вызывал, было несколько .ReportProgress, реализованных в некоторых циклах, и кажется, что поток пользовательского интерфейса не мог справиться с этим (хотя не было инициированных исключений).При запуске программы в режиме отладки программа по какой-то причине работает намного медленнее, и тогда поток пользовательского интерфейса, похоже, не имеет этой проблемы.

0 голосов
/ 23 мая 2018

Я не могу воспроизвести ваш сценарий с пустыми методами read_file(), combine_data() и DataTableToCSV(), поэтому я думаю, что это может быть проблемой с этими методами.Например, read_file() может вызвать исключение, потому что не может найти файл на диске или что-то подобное.

Особенность выброшенного фонового исключения состоит в том, что он не останавливает основное приложение.

через MSDN :

Если операция вызывает исключение, которое не обрабатывается вашим кодом, BackgroundWorker перехватывает исключение и передает его в обработчик событий RunWorkerCompleted, где он отображается каксвойство Error System.ComponentModel .. ::. RunWorkerCompletedEventArgs.Если вы работаете в отладчике Visual Studio, он прервется в той точке обработчика событий DoWork, где возникло необработанное исключение.

Итак, вы можете добавить код в метод worker_RunWorkerCompleted()и чек Exception был брошен.

...