2011-09-15 3 views
6

Ho molti metodi (corrono solo uno alla volta però), tutti utilizzare le stesse RunWorkerCompleated e ProgressChanged metodi, ma tutti hanno diverse Dowork metodi. È sicuro di fare quanto segue:È sicuro annullare l'iscrizione a DoWork dopo aver chiamato RunWorkerAsync ma prima che la funzione venga chiusa?

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

o posso colpire un caso limite facendo questo? Non ho visto nulla sul MSDN in esso dicendo che non era permesso e come (finora) va bene nel mio programma, ma volevo controllare qui per vedere se qualcuno ha eseguito in difficoltà a fare questo.

+0

Sì, è un salvataggio. e altro metodo è thread. –

risposta

1

cosa si potrebbe fare per assicurarsi che il gestore eventi non viene rimosso fino a quando si è fatto con esso sarebbe quello di fare qualcosa di simile 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(); 
} 

E in qualunque gestisce il completamento

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

mi sento, tuttavia; che potrebbe essere meglio avere solo separata BackGroundWorkers per tutte le vostre azioni che è necessario eseguire invece di condividere uno simile a quello o avvolgere in una classe in modo da poter essere più chiari su cosa si sta facendo.

+0

Penso che sto per finire con i lavoratori di sfondo separati come da te suggerito, ma ho ancora vorrei sapere un preciso sì o no su se quello che stavo facendo nel mio OP era sicuro di fare o non. –

+0

@ScottChamberlain Sono abbastanza sicuro che sia sicuro in quanto il modo in cui il modello di evento funziona, l'evento ottiene licenziato per la RunWorkerAsync che inizia il lavoratore sfondo che ha già il delegato per la DoWork Delegato e poi toglierlo dopo che ha tutto avuto luogo – msarchet

+0

Grazie, ma quando e dove dovrei annullare la registrazione di 'RunWorkerCompleted' su' BackgroundWorker'? – Agent007