progressbar - Configuración del trabajador en segundo plano de C#e.Resultar en DoWork y recuperar el valor en WorkCompleted
create background worker c# (3)
Desde MSDN :
Si la operación se completa con éxito y su resultado se asigna en el controlador de eventos DoWork, puede acceder al resultado a través de la propiedad RunWorkerCompletedEventArgs.Result.
and :
Su controlador de eventos RunWorkerCompleted siempre debe verificar las propiedades Error y Canceladas antes de acceder a la propiedad Resultado. Si se generó una excepción o si se canceló la operación, el acceso a la propiedad Resultado genera una excepción.
Entonces, si no se completa con éxito (es decir, si lo cancelas) parece que no funcionará. Quizás considere devolver sus detalles de cancelación como resultado (como éxito) para su caso de cancelación, ¿y detectar la diferencia en el controlador de finalización?
C # 2008 SP1
Estoy usando el trabajador de fondo
Si una de las condiciones falla, estableceré e.cancel en verdadero y asignaré la cadena a e.result. Todo funciona allí.
Sin embargo, cuando se activa WorkCompleted, realizo una prueba para e.Result y obtengo una excepción "e.result produce una excepción de tipo systeminvalidoperation".
Supongo que podría usar una variable global para establecer en el DoWork y comparar el trabajo completado. Pero esto podría no ser seguro para hilos.
¿Alguien puede decirme por qué obtengo esto con el e.Result, y cómo puedo resolverlo?
Muchas gracias,
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 + " ]");
}
}
Es muy probable que sea porque el código cancela el trabajo en lugar de completarlo. Intente acceder al resultado en la rama if (! E.Cancel).
La propiedad Result
está destinada a representar el resultado de una operación completada . Ha establecido Cancel
en verdadero, lo que significa que la operación se canceló, por lo tanto, no debería haber un resultado.
Parece que debería codificar el "Yo aborté porque algo estaba mal" en su resultado, o lanzar una excepción que se establecerá como propiedad de Error
en el resultado en su lugar. Se supone que la Cancel
se debe establecer si el trabajador notó que la llamada fue Cancelado externamente.
Los documentos para and state:
Su controlador de eventos RunWorkerCompleted siempre debe verificar las propiedades Error y Canceladas antes de acceder a la propiedad Resultado. Si se generó una excepción o si se canceló la operación, el acceso a la propiedad Resultado genera una excepción.
La parte de "Excepciones" de la documentación también establece que lanzará una excepción si Cancelled
es verdadero.