C # фоновый работник не вызывает событие dowork на любом компьютере, кроме моего собственного - PullRequest
6 голосов
/ 24 ноября 2011

У меня действительно странная проблема с фоновым рабочим в одном из моих приложений. Недавно я слегка переделал его с помощью некоторых исправлений графического интерфейса, но теперь, когда кто-то на другом ПК запускает .exe или устанавливает мое развертывание OneClick, фоновый работник не вводит событие dowork. Логика не изменилась между двумя выпусками. Я сделал сравнение, и кроме добавления журнала ошибок ничего не изменилось.

Я зашел так далеко, что включил окна сообщений и точки останова в событие dowork, но он никогда не входит в него, кроме как на моем собственном ПК. Даже когда я удаленно отлаживаю, он не входит в событие DoWork

Есть предложения?

Нажатие кнопки даже вызывает событие runworkerasync

private void ScanButton_Click_1(object sender, RoutedEventArgs e)
    {

        Scan = new BackgroundWorker();
        Scan.WorkerReportsProgress = true;
        Scan.DoWork += new DoWorkEventHandler(Scan_DoWork);
        Scan.ProgressChanged += new ProgressChangedEventHandler(Scan_ProgressChanged);
        Scan.RunWorkerCompleted += new RunWorkerCompletedEventHandler(Scan_RunWorkerCompleted);
        Scan.RunWorkerAsync();
    }

Ниже приведен код, который запускает событие DoWork. Я удалил другие функции, которые он делает для простоты. Все, что он делает - это запускает функцию, которая возвращает строку и помещает ее в список, который называется scanresults.

private BackgroundWorker Scan;

    public void Scan_DoWork(object sender, DoWorkEventArgs e)
    {

        System.Windows.Forms.MessageBox.Show("Inside the DoWork");

        BackgroundWorker bw = sender as BackgroundWorker;

        float percentageDone = 0.0F;

        ScanResults = new List<string>();

        try
        {

            System.Windows.Forms.MessageBox.Show("Doing first scan check");

            ScanResults.Add(Functions.LocalComputerName());
            percentageDone = ((1 / 1f) * 100f);
            bw.ReportProgress((int)percentageDone);

        }
        catch (Exception ex)
        {
            System.Windows.MessageBox.Show(ex.Message, "Error Encountered", MessageBoxButton.OK, MessageBoxImage.Exclamation);
        }
    }


public void Scan_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        try
        {
            if (ScanResults.Count == 0)
            {
                System.Windows.Forms.MessageBox.Show("Empty");
                return;
            }
            MachineNameBox.Text = ScanResults[0];
        }
        catch (Exception ex)
        {
            System.Windows.MessageBox.Show(ex.Message, "Error Encountered", MessageBoxButton.OK, MessageBoxImage.Exclamation);
        }
    }

Он полностью игнорирует событие dowork и входит в событие runworkercomplete и передает ошибку для индекса, очевидно, потому что список не был заполнен, поскольку функция делает, что была пропущена. Опять же, это прекрасно работает на моем ПК, но не на других, независимо от того, как я их им предоставляю.

Спасибо за любую помощь

Ответы [ 2 ]

16 голосов
/ 24 ноября 2011

My думаю, означает, что ваш DoWork вызывает исключение, и поэтому вызывается ваш RunWorkerCompleted.

Обратите внимание, что исключения, выданные в методе DoWork BGW, не будутпоймали в попытке ... поймать в RunWorkerCompleted;вместо этого шаблон должен проверить, не является ли свойство Error в параметре RunWorkerCompleted RunWorkerCompletedEventArgs нулевым.Если это не ноль, у вас есть исключение.

Вы можете переделать свой RunWorkerCompleted код следующим образом:

public void Scan_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
    if (e.Error != null) {
        // You have an exception, which you can examine through the e.Error property.
    } else {
        // No exception in DoWork.
        try {
            if (ScanResults.Count == 0) {
                System.Windows.Forms.MessageBox.Show("Empty");
                return;
            }
            MachineNameBox.Text = ScanResults[0];
        } catch (Exception ex) {
            System.Windows.MessageBox.Show(ex.Message, "Error Encountered", MessageBoxButton.OK, MessageBoxImage.Exclamation);
        }
    }
}

См. BackgroundWorker.RunWorkerCompleted Event для получения дополнительной информации.информация и лучший пример, чем мой.

0 голосов
/ 27 декабря 2018

Для меня это было то, что мой основной проект был подписан, а новая DLL, которую я ввел, не была.Это странно, потому что я никогда не получал предупреждение или ошибку, и проект скомпилирован нормально.Только то, что background_dowork () никогда не попадет в отладку.Как только я добавил сертификат подписи в DLL, он отлично запустил этого фонового работника.

...