2013-01-03 12 views
13

ho voluto provare la mia fortuna a filettatura con C#, so che alcune cose su filettatura in C.Come terminare una discussione in C#?

Quindi volevo solo chiedere se volevo terminare un thread, dovrei farlo con smt.Abort() o si "ucciderà" dopo la fine della funzione?

Inoltre, c'è qualcosa come pthread_exit() in C in C#?

Ci scusiamo per il mio inglese. :)

+0

Di solito è meglio lasciare che un thread "si esaurisca dal metodo di esecuzione stesso" dove verrà effettivamente terminato. –

+1

Quale versione di .NET stai usando? – dotNETbeginner

+0

La terminazione dei thread è problematica, ma di solito il suicidio no. Come pthread_exit(). Thread.CurrentThread.Abort(). Non è utile. –

risposta

47

Thread.Abort sarà "uccidere" il filo, ma questo è più o meno equivalente a:

Scenario: Si desidera spegnere il computer

Soluzione: si cinghia dinamite al computer, accenderla, e correre .

È MOLTO meglio attivare una "condizione di uscita", tramite CancellationTokenSource.Cancel, impostando alcuni (accesso sicuro) "sta eseguendo" bool, ecc. E chiamando Thread.Join. Questo è più simile:

Scenario: Si desidera spegnere il computer

Soluzione: Si fa clic su Start, Chiudi sessione, e attendere che il computer si giù.

+6

Come si passa 'CancellationTokenSource' a un oggetto' System.Threading.Thread'? – AaA

+4

L'analogia con la dinamite: P. +1 – RBT

+0

@AaA: passa come [** parametro **] (https://msdn.microsoft.com/en-us/library/6x4c42hc (v = vs.110) .aspx). –

3

Terminare un thread esternamente (dall'esterno del thread) è una cattiva idea; non sai mai cosa stesse facendo il thread quando lo uccidi in modo asincrono. In C#, se la funzione thread ritorna, il thread termina.

Questo articolo MSDN How to: Create and Terminate Threads (C# Programming Guide) contiene alcune note e alcuni codici di esempio che probabilmente saranno utili.

+0

Quello che stai suggerendo è figo e accettabile, tuttavia, come si chiede a un thread di "chiuderlo già, ora è il mio turno di parlare"? – AaA

+0

Non sei sicuro di cosa intendi specificamente; ma la maggior parte delle persone che scrivono codice threadato fornisce ai loop che corrono all'interno del thread un segnale esterno che il loop del thread può controllare e chiudere in modo ordinato. Se hai in mente uno scenario specifico, forse dovresti pubblicare una domanda con i dettagli. – MikeB

+0

Hai assolutamente ragione. Faccio lo stesso, tuttavia a volte (ad esempio) una presa di ascolto rimane bloccata in un ciclo di lettura e non vuole uscire dal ciclo e ascoltare le tue istruzioni per uscire, in questi casi, Thread.Abort() è l'ultima risorsa per sistemare le cose Potresti perdere alcuni dati ma almeno hai salvato il tuo programma da crash. – AaA

1

Non è necessario terminare manualmente un thread una volta terminata la funzione.

Se si spawn un thread per eseguire un metodo, una volta che il metodo ha restituito il filo sarà interrotto automaticamente in quanto ha più nulla da eseguire. *

Ovviamente si può, interrompere manualmente un thread semplicemente chiamando Abort(), ma questo è praticamente non raccomandato a causa della potenziale corruzione dello stato del thread a causa della determinazione inaffidabile di dove si trova un thread nel suo stato di esecuzione corrente. Se hai bisogno di gestire te stesso l'uccisione dei thread, potresti essere più interessato a utilizzare uno CancellationToken. È anche possibile leggere l'articolo Cancellation of Managed Threads su MSDN.

** Cioè, a meno che tu stia usando un ThreadPool per eseguire il tuo lavoro. Non dovresti preoccuparti di interrompere questi thread mentre vengono riutilizzati in diverse attività in coda.

+0

Come si termina un thread del listener di socket che sta ascoltando una porta indefinitamente? A proposito, credo che la classe Thread non accetti CancellationToken, o no? – AaA

+0

@AaA Vedere il secondo link di riferimento nella mia risposta, ti dà un esempio 'CancellationToken'. –

+0

Puoi usare 'CancellationToken' con la classe' System.Threading.Thread'? Non si comporterà come una variabile booleana statica? – AaA

0
Thread.Abort() 
Thread.Join(); 
Thread = null; 
Problemi correlati