Domanda

Quando interrompo l'esecuzione di un thread dubito sempre tra un'uscita graziosa con un gestore di eventi come questo:

int result = WaitHandle.WaitAny(handles);
if (result = WAIT_FINALIZE)
  FinalizeAndExit();

e usando l'evento per segnalare il thread che deve terminare

o semplicemente gestendo ThreadAbortException per finalizzare il thread ...

try
{
  // Main execution
}
catch(ThreadAbortException e)
{
  // FinalizeAndExit();
}
finally
{
}

Di solito sono incline a usare l'approccio ThreadAbortException poiché può essere gestito ma viene rialzato alla fine del blocco catch ed evita inoltre che il thread venga mantenuto in vita da "traditore" metodi, ma ho visto entrambi gli approcci.

Qual è la tua opinione? Esiste una situazione in cui è meglio usarne uno rispetto all'altro o è meglio usare sempre l'approccio x?

È stato utile?

Soluzione

Generalmente, il primo metodo è preferibile.

È difficile (se non impossibile) scrivere codice che gestirà sempre una ThreadAbortException con garbo. L'eccezione può verificarsi nel mezzo di qualunque cosa stia facendo il thread, quindi alcune situazioni possono essere difficili da gestire.

Ad esempio, l'eccezione può verificarsi dopo aver creato un oggetto FileStream, ma prima che il riferimento sia assegnato a una variabile. Ciò significa che hai un oggetto che dovrebbe essere eliminato, ma l'unico riferimento ad esso è perso nello stack da qualche parte ...

Altri suggerimenti

Se posso, cerco di evitare l'uso di Thread.Abort. Il problema con Thread.Abort è che potrebbe verificarsi in (quasi) qualsiasi riga del codice di esecuzione e potrebbe causare alcuni "interessanti" comportamento (leggi: bug). Intendo preferisco avere un punto di uscita sul mio codice che controlla un evento o una variabile per vedere se il thread dovrebbe smettere di funzionare ed uscire con grazia.

Sicuramente se l'evento di terminazione è previsto, allora non è un'eccezione (secondo la rigorosa definizione del termine), quindi dovresti usare il primo metodo. Un'uscita aggraziata mostra anche che hai il controllo.

Sebbene le eccezioni siano utili e in alcuni casi necessarie, possono e vengono abusate.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top