2010-12-02 2 views
0

Недавно я переписал приложение Windows Forms для использования экземпляров BackgroundWorker вместо использования созданных вручную рабочих потоков. После проверки я заметил, что некоторые тесты начали терпеть неудачу. После некоторых отладки я могу продемонстрировать режим мои проблемы, показывая вам следующие 2 теста:System.ComponentModel.BackgroundWorker никогда не вызывает ProgressChanged

[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

Добавить

WindowsFormsSynchronizationContext.AutoInstall = false; 

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

+0

Большое вам спасибо, сработал сразу! – Michael 2010-12-02 08:37:25

Смежные вопросы