Esiste un modo per garantire l'esecuzione dell'intero blocco di codice in un thread .NET?

StackOverflow https://stackoverflow.com/questions/47144

  •  09-06-2019
  •  | 
  •  

Domanda

Nel mio programma C#, ho un thread che rappresenta un test in esecuzione, che può essere interrotto facendo clic su un pulsante etichettato "Interrompi esecuzione".Affinché il thread (e quindi il test) possa terminare in maniera elegante (e svolgere un lavoro fondamentale in anticipo), questo pulsante viene abilitato solo in alcuni momenti ben definiti, in cui mi accorgo ThreadAbortedException, Fare Thread.ResetAbort() e morire magnificamente (cioè il filo).

Il problema è che, nella finestra temporale in cui è possibile interrompere, ci sono alcune attività che devono essere eseguite dall'inizio alla fine una volta avviate e, quindi, temo TAE.I blocchi non forniscono una soluzione a questo problema e, sebbene alla fine i blocchi lo facciano, non trovo elegante racchiudere il codice importante nel modo seguente:

try {
} finally {
  // vital code
}

Tuttavia non ho trovato altra soluzione.

È questo un altro modo per ritardare l'interferenza di ThreadAbortException fino alla fine del blocco?

È stato utile?

Soluzione

Le situazioni in cui verrà generata una ThreadAbortException possono essere complesse.Un'opzione migliore potrebbe essere quella di chiedere perché stai utilizzando ThreadAbortExceptions.

Uno schema migliore sarebbe quello di utilizzare semplicemente un flag per indicare al thread in esecuzione che dovrebbe interrompersi, quindi testare regolarmente il flag mentre funziona.Se è impostato, puoi lanciare un'eccezione a quel punto, se lo desideri.

Con questo modello hai il controllo totale di quando il thread agirà sull'interruzione e non devi preoccuparti dell'interruzione delle operazioni critiche.

Altri suggerimenti

Utilizzo Thread.BeginCriticalRegion()

Notifica a un host che l'esecuzione sta per entrare in un'area di codice in cui gli effetti di un'interruzione del thread o di un'eccezione non gestita potrebbero mettere a repentaglio altre attività nel dominio dell'applicazione.

Thread.BeginCriticalRegion()

//do important stuff here

Thread.EndCriticalRegion()
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top