Как правило, фоновый работник возвращается в тот же поток и на самом деле выдает исключение для потока, не являющегося пользовательским интерфейсом. Тем не менее, это может быть съедено в вашем случае. Вы должны использовать событие RunWorkerCompleted
для элементов, которые должны произойти после того, как ваша основная работа завершена, особенно когда вы хотите обновить пользовательский интерфейс. И этот должен возвращаться в тот же поток, из которого он был вызван (пользовательский интерфейс в вашем случае), как упомянуто выше.
Итак, я бы переместил ваш код обработки пользовательского интерфейса (RefreshReport
) в новый метод, настроенный для RunWorkerCompleted.
Однако, я бы посоветовал взглянуть на Task Parallel Library . В итоге код становится намного чище и проще для отладки IMO.
Пример (грубый и может не скомпилироваться из-за пустых значений, но вы можете получить jist:)):
var task = Task.Factory.StartNew(()=>{//Do Async Stuff});
task.ContinueWith((previousTask)=>{//Do your UI Stuff}, null, null,
TaskScheduler.FromCurrentSynchronizationContext);
//The FromCurrentSync makes sure the method returns
//to the same thread (UI in this case) that it started
Я знаю, что это не прямой ответ, а скорее предложение относительно того, что я бы назвал более чистым, более отлаживаемым подходом.