2009-05-13 2 views
16

C# 2008 SP1C# Фоновая установка e.Result в DoWork и получать значение обратно в WorkCompleted

Я использую фон рабочего

Если одно из условий не удается обращу e.cancel в истинный работник, и назначьте строку e.result. Там все работает.

Однако, когда workCompleted fire, я тестирую e.Result и получаю исключение «e.result исключает тип systeminvalidoperation».

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

Может ли кто-нибудь сказать мне, почему я получаю это с e.Result, и как я могу это решить?

Большого спасибо,

private void bgwPrepareCall_DoWork(object sender, DoWorkEventArgs e) 
    { 
     // Check to see if the called number is blocked. 
     // If the nubmer is blocked display error message. 
     if (this.IsNoGateway(sipUsername, statusDisplay1.PhoneNumber)) 
     { 
      // this.SetIdleState(DialerErrorMessage.GetErrorDescription(12)); 
      e.Cancel = true; 
      e.Result = "NoGateway"; 
      return; 
     } 

     if (!this.IsInvalidTelephoneNumber(sipUsername, statusDisplay1.PhoneNumber)) 
     { 
      // this.SetIdleState(DialerErrorMessage.GetErrorDescription(13)); 
      e.Cancel = true; 
      e.Result = "InvalidNumber"; 
      return; 
     } 
    } 

    private void bgwPrepareCall_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
    { 
     if (e.Error == null) 
     { 
      if (e.Cancelled) 
      { 
       // Failed 
       switch (e.Result.ToString()) 
       { 
        case "NoGateway": 
         Console.WriteLine("NoGateway: [ Failed ]"); 
         break; 

        case "InvalidNumber": 
         Console.WriteLine("InvalidNumber: [ Failed ]"); 
         break; 

        default: 
         Console.WriteLine("Unknown"); 
         break; 
       } 
      } 
      if (!e.Cancelled) 
      { 
       // Successfull 
       Console.WriteLine("NoGateway: [ ok ]");  
       Console.WriteLine("InvalidNumber: [ ok ]"); 
      } 
     } 
     else 
     { 
      Console.WriteLine("PrepareCall Failed: [ " + e.Error.Message + " ]"); 
     } 
    } 

ответ

27

MSDN От:

Если операция завершается успешно и его результат назначается в обработчике события DoWork, вы можете получить доступ к результату через RunWorkerCompletedEventArgs.Result собственности.

and:

Ваш RunWorkerCompleted обработчик события должен всегда проверять ошибки и Отменено свойства перед доступом к Свойство Результат. Если исключение было поднято или если операция была отменена, доступ к объекту Результат вызывает исключение.

Так что если не успешно завершена (т.е. отменить его), похоже, это не будет работать. Возможно, подумайте о возврате данных об аннулировании в качестве результата (как успеха) для вашего прерывания, обнаружив разницу в обработчике завершения?

17

Свойство Result предназначено для представления результата завершенных операции. Вы установили Cancel в значение true, что означает, что операция была отменена, поэтому результата не должно быть.

Похоже, вы должны кодировать «Я прервана, потому что что-то не так» в ваш результат, или выбросить исключение, которое будет установлено в качестве Error имущества в результате вместо - Cancel предназначен быть установлен, если работник заметил что звонок был отменен извне.

Документах для RunWorkerCompletedEventArgs.Result состояния:

Ваш RunWorkerCompleted обработчик события всегда должны проверить ошибки и Отменено свойства перед доступом к Свойство Результат. Если исключение было поднято или если операция была отменена, доступ к объекту Результат вызывает исключение.

В разделе «Исключения» в документации также указано, что оно выдаст исключение, если значение Cancelled истинно.

2

Это скорее всего из-за того, что код отменяет работу, а не завершает ее. Поэтому попробуйте получить результат в ветке if (! E.Cancel).