System.ComponentModel.BackgroundWorker никогда не вызывает ProgressChanged - PullRequest
0 голосов
/ 02 декабря 2010

Я недавно переписал свое приложение Windows Forms для использования экземпляров BackgroundWorker вместо использования созданных вручную «рабочих потоков». После регистрации я заметил, что некоторые тесты начали проваливаться. После некоторой отладки я могу продемонстрировать свои проблемы, показав вам следующие 2 теста:

    [Test]        
    public void Test_A()
    { 
        bool progressChanged = false;
        var worker = new BackgroundWorker();
        worker.WorkerReportsProgress = true;
        worker.DoWork += (s, e) => worker.ReportProgress(0, null);
        worker.ProgressChanged += (s, e) => progressChanged = true;
        worker.RunWorkerAsync();
        Thread.Sleep(100);
        progressChanged.ShouldBeTrue();            
    }

    [Test]        
    public void Test_B()
    { 
        //Creation of o form component causes (?) this test to fail, even do I dispose it
        var view = new Form();
        view.Dispose();

        bool progressChanged = false;
        var worker = new BackgroundWorker();
        worker.WorkerReportsProgress = true;
        worker.DoWork += (s, e) => worker.ReportProgress(0, null);
        worker.ProgressChanged += (s, e) => progressChanged = true;
        worker.RunWorkerAsync();
        Thread.Sleep(100);
        progressChanged.ShouldBeTrue();            
    }

Test_A успешно, а Test_B - неудачно. Это независимо от того, сплю я 100 мс или 100 минут. Зачем?? Кажется, что мой рабочий код работает, но раздражает отсутствие возможности использовать набор регрессионных тестов (у меня есть другой тест, создающий компоненты Forms, и эти тесты должны быть выполнены ДО моего теста с использованием BackgroundWorker) Следующим шагом будет изучение исходного кода BackgroundWorker, но перед тем, как я это сделаю, я подумаю, что проверю здесь помощь.

С уважением, Майкл

1 Ответ

1 голос
/ 02 декабря 2010

Добавить

WindowsFormsSynchronizationContext.AutoInstall = false;

В Test_B () перед чем-либо еще.BackgroundWorker, который очень ориентирован на пользовательский интерфейс (то есть: Winforms), дико гадает, как синхронизировать вещи, но не так, как вы хотите.Посмотрите здесь некоторые объяснения (особенно от Скотта Берри): WindowsFormsSynchronizationContext

...