Как обработать исключение, вызванное в обработчике BackgroundWorker? - PullRequest
1 голос
/ 19 августа 2011

Я думал, что объект BackgroundWorker будет перехватывать и передавать исключения, возникшие в обработчике DoWork, в обработчик RunWorkerCompleted, но это не происходит с моей программой.

Я создал следующую небольшую программу для иллюстрации проблемы. Создано приложение wpf.
открытый частичный класс MainWindow: Window { public MainWindow () { InitializeComponent (); ExecBackgrpundWorker (); }

    public void ExecBackgrpundWorker()
    {
        var bw = new BackgroundWorker();
        bw.DoWork += new DoWorkEventHandler(bw_DoWork);
        bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);


        bw.RunWorkerAsync();
    }

    void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        try
        {
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

    void bw_DoWork(object sender, DoWorkEventArgs e)
    {
        throw new NotImplementedException("Do Work Exception");
    }
}

исключения, возникшие в bw_DoWork, никогда не передаются в bw_RunWorkerCompleted.

Как правильно обработать это исключение.

Ответы [ 3 ]

1 голос
/ 20 августа 2011

Исключение перехватывается фоновым потоком и присваивается свойству «Ошибка» параметра RunWorkerCompletedEventArgs в RunWorkerCompleted.

0 голосов
/ 25 октября 2014

Измените свой код на:

public void ExecBackgrpundWorker()
{
    var bw = new BackgroundWorker();
    bw.DoWork += new DoWorkEventHandler(bw_DoWork);
    bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);


    bw.RunWorkerAsync();
}

void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    if(e.Error != null)
    {
        MessageBox.Show(e.Error.Message);
    }
}

void bw_DoWork(object sender, DoWorkEventArgs e)
{
    throw new NotImplementedException("Do Work Exception");
}

Если вы отладили и получили исключение, не обработанное кодом пользователя, нажмите «Продолжить», после чего вы достигнете bw_RunWorkerCompleted.Когда вы запускаете свой код как релиз, он всегда попадает в bw_RunWorkerCompleted.

0 голосов
/ 17 июля 2012

Он никогда не попадает в обработчик RunWorkerCompleted. он молча терпит неудачу.

Мой пример - проверка Active Directory на наличие списка групп безопасности. Я ввел недопустимый домен для проверки обработки ошибок ... silent.

...