2013-11-08 3 views
1

Я пытался следовать этому MSDN example и используя приведенный ниже код. Тем не менее, e.Error ВСЕГДА имеет значение null в RunWorkerCompleted, даже если в SomeMethod() произошла ошибка;Ошибка захвата BackgroundWorker

private void WorkerDoWork(object sender, DoWorkEventArgs e) 
{ 
    getMethod = SomeMethod(); 
} 

private void Worker_RunWorkerCompleted(object sender, 
              RunWorkerCompletedEventArgs e) 
{ 
    if (e.Error != null) 
    { 
     var result = ModernDialog.ShowMessage("Error occurred.... " + 
            e.Result, "ErrorTitle", MessageBoxButton.OK); 
    } 
    else if (e.Cancelled) 
    { 

    } 
    Else 
    { 

    } 
} 

Может ли кто-нибудь увидеть, что я делаю неправильно?

Я могу обойти это, выполнив следующее, но я не совсем понимаю, почему пример в MSDN не работает для меня?

private void WorkerDoWork(object sender, DoWorkEventArgs e) 
{ 
    try 
    { 
     getMethod = SomeMethod(); 
    } 
    catch(Exception ex) 
    { 
     e.Result = ex; 
    } 
} 

private void Worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 

    if (e.Result is Exception) 
    { 
      var result = ModernDialog.ShowMessage("Error occurred.... " + e.Result, "ErrorTitle", MessageBoxButton.OK); 
    } 

    //etc 
} 

Также, используя второй метод, я не могу получить доступ к .Message из e.Result. Например, в WorkerDoWork я могу использовать ex.Message

Редактировать: я установил рабочий для создания собственной ошибки, и я все равно получаю e.Error == null. Переменный отображаются немного тусклая, как CTRL + PrtSc делает увядает enter image description here

+0

В WinForms я не могу дублировать проблему. Вы уверены, что не попадаете в эту ошибку? – LarsTech

+0

Определенно не поймать ошибку, SomeMethod(); не содержит попыток, выписок catch. Это в приложении WPF, если это имеет значение? – user3357963

+0

Взгляните на [мой вопрос] (http://stackoverflow.com/questions/19793377/servicecontroler-getservices-silently-bailing-in-a-background-thread), который может быть relivent. – gunr2171

ответ

3

Я думаю, что проблема ваш пустой блок исключения в emailWorkerDoWork(). Для того чтобы результат был исключением, вы не можете поймать исключения в своем фоновом работнике.

Так что-то подобное должно дать вам желаемый результат:

private void emailWorkerDoWork(object sender, DoWorkEventArgs e) 
{ 
    int value = 1/int.Parse("0"); 
} 

я нашел другой ТАК ответить, что подтверждает мое подозрение и предоставляет ссылку MSFT here.

+0

Отлично, теперь он работает. Спасибо за помощь каждого. – user3357963

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