То, что вы описываете, не является определенным поведением BackgroundWorker. Вы подозреваете, что вы делаете что-то не так.
Вот небольшой пример, демонстрирующий, что BackgroundWorker использует исключения в DoWork и делает их доступными для вас в RunWorkerCompleted :
var worker = new BackgroundWorker();
worker.DoWork += (sender, e) =>
{
throw new InvalidOperationException("oh shiznit!");
};
worker.RunWorkerCompleted += (sender, e) =>
{
if(e.Error != null)
{
MessageBox.Show("There was an error! " + e.Error.ToString());
}
};
worker.RunWorkerAsync();
Мои навыки психической отладки показывают мне вашу проблему: вы обращаетесь к e.Result в вашем обработчике RunWorkerCompleted - если есть e.Error, вы должны обработать ее, не обращаясь к e.Result. Например, следующий код является плохим, плохим, плохим и выдает исключение во время выполнения:
var worker = new BackgroundWorker();
worker.DoWork += (sender, e) =>
{
throw new InvalidOperationException("oh shiznit!");
};
worker.RunWorkerCompleted += (sender, e) =>
{
// OH NOOOOOOOES! Runtime exception, you can't access e.Result if there's an
// error. You can check for errors using e.Error.
var result = e.Result;
};
worker.RunWorkerAsync();
Вот правильная реализация обработчика события RunWorkerCompleted:
private void RunWorkerCompletedHandler(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Error == null)
{
DoSomethingWith(e.Result); // Access e.Result only if no error occurred.
}
}
VOILA, вы не получите исключений во время выполнения.