2009-05-13 6 views
16

C# 2008 SP1C operaio # Impostazioni sfondo e.Result in DoWork e ottenere il valore indietro nel WorkCompleted

Sto usando il lavoratore sfondo

Se una delle condizioni fallisce io metterò e.Cancel true, e assegnare la stringa a e.result. Tutto funziona lì.

Tuttavia, quando il workCompleted si attiva, eseguo il test per e.Result e ottengo un'eccezione "e.result genera un'eccezione di tipo systeminvalidoperation".

Suppongo di poter utilizzare una variabile globale da impostare nel DoWork e confrontare nel lavoro completato. Ma questo potrebbe non essere infallibile.

Qualcuno può dirmi perché sto ottenendo questo con e.Result, e come posso risolvere questo?

Molte grazie,

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

risposta

27

Da MSDN:

Se l'operazione viene completata con successo e il suo risultato è assegnato nel gestore di eventi DoWork, è possibile accedere al risultato attraverso il RunWorkerCompletedEventArgs.Result proprietà.

and:

vostro gestore di eventi RunWorkerCompleted dovrebbe sempre controllare l'errore e proprietà annullate prima di accedere la proprietà dei risultati. Se è stata sollevata un'eccezione o se l'operazione è stata annullata , l'accesso alla proprietà Result genera un'eccezione.

Quindi, se non si completa con successo (cioè si annulla) sembra che non funzionerà. Forse considerare di restituire i dettagli della cancellazione come risultato (come successo) del caso di annullamento, rilevando la differenza nel gestore di completamento?

17

La proprietà Result vuole rappresentare il risultato di un'operazione completata. Hai impostato Cancel su true, il che significa che l'operazione è stata annullata, quindi non ci dovrebbe essere un risultato.

Suona come si dovrebbe codificare il "Ho interrotto perché qualcosa non andava" nel risultato, o un'eccezione che sarà impostata come la proprietà Error nel risultato, invece - Cancel è destinata ad essere impostata se il lavoratore ha notato che la chiamata è stata annullata esternamente.

la documentazione per RunWorkerCompletedEventArgs.Result Stato:

il gestore di eventi RunWorkerCompleted deve sempre controllare l'errore e proprietà annullate prima di accedere alla proprietà risultato. Se è stata sollevata un'eccezione o se l'operazione è stata annullata , l'accesso alla proprietà Result genera un'eccezione.

La parte "Eccezioni" della documentazione indica inoltre che genererà un'eccezione se Cancelled è true.

2

Molto probabilmente perché il codice annulla l'opera anziché completarla. Quindi prova ad accedere al risultato nel ramo if (! E.Cancel).