2009-03-20 23 views
5

He estado luchando con el manejo de eventos en hilos de Backgroundworker.Manejo de eventos de trabajador de fondo

Toda la documentación que he encontrado me hace creer que cuando un controlador de eventos DoWork arroja una excepción, esa excepción debe tratarse en el manejador RunWorkerCompleted y esa excepción estará disponible en la propiedad Error de RunWorkerCompletedEventArgs.

Esto está bien, pero durante el tiempo de depuración siempre veo una excepción no controlada por mensaje de código de usuario. Esto me hace creer que hay un problema con mi enfoque.

¿Qué pasos debo seguir para resolver esto?

Saludos, Jonathan

Respuesta

2

que he visto este comportamiento antes, y he conseguido alrededor decorando el manejador DoWork con el atributo System.Diagnostics.DebuggerNonUserCode:

[System.Diagnostics.DebuggerNonUserCode] 
void bw_DoWork(object sender, DoWorkEventArgs e) 
{ ... } 

Nota que solo verá esto si se ejecuta en el depurador; incluso sin el atributo, todo es como debería ser cuando se ejecuta desde el shell.

He vuelto a consultar esto y aún no veo una buena razón para hacerlo. Lo llamo defecto de depuración.

+0

¿Por qué necesita hacer esto? Porque así es como funciona BackgroundWorker. Mucho más fácil de manejar el error en el hilo de llamada que en el hilo de trabajo. Pero cuando se depura, la otra forma es verdadera ya que tiene acceso a todas las variables locales. – Samuel

+0

No creo que "así es como funciona BackgroundWorker" es una respuesta satisfactoria. Parece que ve todas las excepciones como indicativas de errores de codificación, eso es verdad solo algunas veces. Si quisiera que el depurador rompiera una excepción manejada, activaría excepciones de primera oportunidad o establecería un punto de interrupción. –

0

Su enfoque es correcto. Simplemente presione continuar en el mensaje y continúe. En caso de duda, pruébela fuera de una sesión de depuración.

1

He tenido este problema antes. El e.Error solo se establece cuando no se ejecuta en el modo de depuración. Si ejecuta Debug, la ejecución se detiene en el lugar de la Excepción. Sin embargo, ejecute el mismo programa en el modo No depuración (en VS Debug -> Iniciar sin depuración o Ctrl + F5) y el desagradable diálogo de excepción NO aparecerá, y e.Error será la excepción. No estoy seguro de por qué, pero así es como funciona ....

Cuestiones relacionadas