2009-05-13 4 views
16

C# 2008 SP1C# tło pracownik ustawienie e.Result w DoWork i uzyskanie wartości z powrotem w WorkCompleted

Używam tle Pracownik

Jeżeli jeden z warunków nie będę ustawić e.cancel true, i przypisz ciąg do e.result. Wszystko tam działa.

Jednak po zakończeniu pracy, którą wykonuję, testuję pod kątem e.Result i otrzymuję wyjątek "e.result rzuca wyjątek typu systeminvalidoperation".

Chyba mógłbym użyć zmiennej globalnej do ustawienia w DoWork i porównać w pracy zakończonej. Ale może to nie być bezpieczne dla wątków.

Czy ktoś może mi powiedzieć, dlaczego otrzymuję to z e.Result i jak mogę to rozwiązać?

Dziękujemy,

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 + " ]"); 
     } 
    } 

Odpowiedz

27

Od MSDN:

Jeśli operacja zakończy się powodzeniem i jego wynik jest przypisany w obsługi zdarzeń DoWork, można uzyskać dostęp do wyników przez RunWorkerCompletedEventArgs.Result nieruchomości.

and:

Twój RunWorkerCompleted obsługi zdarzeń powinien zawsze sprawdzić błąd i Anulowane właściwości przed uzyskaniem dostępu właściwość Result. Jeśli został zgłoszony wyjątek lub anulowano operację , uzyskanie dostępu do właściwości Wynik powoduje zgłoszenie wyjątku.

Więc jeśli nie zakończona sukcesem (tj ją anulować) wygląda na to, że nie będzie działać. Może zastanawiasz się nad zwróceniem szczegółów anulowania w wyniku (jako sukcesu) dla sprawy abort, wykrywając różnicę w obsłudze zakończenia?

17

Obiekt Result ma symbolizować jego wynik zakończonego operacji. Ustawiłeś Cancel na true, co oznacza, że ​​operacja została anulowana, dlatego nie powinno być wyniku.

Brzmi jak należy zakodować „ja przerwana dlatego, że coś jest nie tak” do swojego wyniku, czy wyjątek, który zostanie ustawiony jako własność w rezultacie zamiast Error - Cancel ma być ustawiony, jeśli pracownik zauważył że połączenie zostało anulowane na zewnątrz.

Docs dla RunWorkerCompletedEventArgs.Result stanie:

Twój RunWorkerCompleted obsługi zdarzeń powinien zawsze sprawdzić błąd i Anulowane właściwości przed uzyskaniem dostępu własnością wynik. Jeśli został zgłoszony wyjątek lub anulowano operację , uzyskanie dostępu do właściwości Wynik powoduje zgłoszenie wyjątku.

W części "Wyjątki" podano również, że zgłoszony zostanie wyjątek, jeśli Cancelled jest prawdziwy.

2

Jest to najprawdopodobniej dlatego, że kod Anuluje pracę zamiast ją wypełniać. Więc spróbuj uzyskać dostęp do wyniku w gałęzi if (! E.Cancel).

Powiązane problemy