2011-09-15 8 views
6

Tengo muchos métodos (pero solo se ejecutan de uno en uno), todos usan los mismos métodos RunWorkerCompleated y ProgressChanged pero todos tienen diferentes métodos Dowork. ¿Es seguro hacer lo siguiente:¿Es seguro anular la suscripción a DoWork después de llamar a RunWorkerAsync pero antes de que la función finalice?

private void button_Process_Click(object sender, EventArgs e) 
{ 
    bgWork_Process.DoWork += Scrub_DoWork; 
    bgWork_Process.RunWorkerAsync(); 
    bgWork_Process.DoWork -= Scrub_DoWork; 
} 

o puedo golpear una caja de borde haciendo esto? No vi nada en MSDN diciendo que no estaba permitido y que (hasta ahora) funciona bien en mi programa, pero quería verificar aquí si alguien ha tenido problemas para hacer esto.

+0

Sí, es guardar. y otro método es hilo. –

Respuesta

1

lo que podría hacer para asegurarse de que no se va a quitar el controlador de eventos hasta que haya terminado con él sería hacer algo similar a

Action DoWorkAction; 

private void button_Process_Click(object sender, EventArgs e) 
{ 
    gbHistory.Enabled = false; 
    gbScrub.Enabled = false; 
    DoWorkAction = new Action(Scrub_DoWork); 
    bgWork_Process.DoWork += DoWorkAction; 
    bgWork_Process.RunWorkerAsync(); 
} 

Y en lo que se encarga de su finalización

private void bgWork_Process_CompletedHandler(object sender, EventArgs e) 
{ 
    bgWork_Process.DoWork -= DoWorkAction; 
} 

Me siento, sin embargo; que puede ser mejor tener solo BackGroundWorkers para todas tus acciones que necesites realizar en lugar de compartir una similar con eso o envolver en una clase para que puedas tener más claro lo que estás haciendo.

+0

Creo que voy a terminar usando trabajadores de base por separado como usted sugirió, pero aún me gustaría saber un sí o un no definitivo si lo que estaba haciendo en mi OP era seguro o no. –

+0

@ScottChamberlain Estoy bastante seguro de que es seguro ya que la forma en que funciona el patrón de evento, el evento se activa para el RunWorkerAsync que inicia el trabajador de fondo que ya tiene el delegado para DoWork Delegate y luego lo quita después de que tenga todo lugar tomado. – msarchet

+0

Gracias, pero ¿cuándo y dónde debería anular el registro de 'RunWorkerCompleted' en un' BackgroundWorker'? – Agent007

Cuestiones relacionadas