Sto usando un'applicazione che sincronizza i thread usando ManualResetEvent. FxCop mi ha detto di eliminare quegli oggetti. Ho trovato la seguente discussione, che mi ha detto la stessa:Quando deve essere eliminato un oggetto ManualResetEvent?
Do I need to Dispose() or Close() an EventWaitHandle?
Ma io non so quando di disporre un'istanza di un ManualResetEvent.
Il seguente codice semplificato illustra il problema:
private void btn_Click(object sender, EventArgs e)
{
var mre = new ManualResetEvent(false);
new Thread(() => this.SetEvent(mre)).Start();
for (int i = 0; i < 10; ++i)
{
new Thread(() => this.WaitFor(mre)).Start();
}
}
private void SetEvent(ManualResetEvent manualResetEvent)
{
Thread.Sleep(10000);
manualResetEvent.Set();
}
private void WaitFor(ManualResetEvent manualResetEvent)
{
manualResetEvent.WaitOne();
}
Il problema è che non esistono più istanze del ManualResetEvent e più thread sono in attesa per ogni istanza.
Se memorizzo le istanze in un elenco, non so quando disporlo. Smaltendolo dopo WaitOne() - la chiamata lo smaltirà più volte e forse verrà eliminato mentre altri thread sono ancora in attesa.
Il thread che ha creato l'evento non ha alcun riferimento ad esso. Il thread setter non dovrebbe eliminarlo perché ci sono altri thread che attendono questo MRE. Ogni thread in attesa non è in grado di eliminarlo come menzionato prima.
Quindi la domanda è: quando questo ManualResetEvent deve essere smaltito?
Il codice non ha senso e c'è solo * una * istanza di MRE. Smaltirlo alla fine del metodo va bene. –
No, non penso.Il codice che crea il MRE è un gestore di eventi click del pulsante. Puoi fare clic più volte per creare più MRE. Il codice sopra è semplificato. Smaltire il MRE alla fine di questo metodo non funzionerà perché ci sono 11 thread che stanno usando questo MRE dopo che il metodo è stato completato. Il thread setter attende 10 secondi e altri 10 thread attendono questo MRE. –