controlla se il thread ha terminato il suo metodo prima di “ucciderlo” c #

Ho 2 thread nel mio programma. 1 sta gestendo una GUI e l’altra sta facendo un po ‘di automazione delle parole. Li chiamiamo GUIThread e WorkerThread.

WorkerThread sta eseguendo il looping dei metodi usando la ricorsione. WorkerThread è vivo solo mentre si fa l’automazione della parola e l’utente deve essere in grado di fermare la parola automazione. Pertanto ho implementato un pulsante “Stop” sulla GUI che semplicemente uccide / termina il WorkerThread. Tuttavia se uccido WorkerThread mentre è nel mezzo di un metodo a volte causa un problema nel mio documento word (questa è una storia più lunga) ed è per questo che voglio controllare se WorkerThread ha finito / restituito da un metodo prima che io uccida esso.

Questo è ciò che fa il mio codice quando premo il pulsante “Stop”:

//Stops the worker thread = stops word automation in process workerThread.Abort(); //This blocks the thread until the workerThread has aborted while (workerThread.IsAlive) ; 

Il mio suggerimento / soluzione per il problema era di avere una variabile globale che potevo impostare ogni volta che il WorkerThread è entrato e lasciato un metodo, ma questo non mi sembra giusto. Voglio dire, penso che ci debba essere un modo più semplice per affrontarlo.

    Tuttavia se uccido WorkerThread mentre è nel mezzo di un metodo a volte causa un problema nel mio documento word

    Questo è il motivo per cui non si dovrebbe mai uccidere un thread. Non puoi dire cosa stava facendo il thread, se è sicuro uccidere? ecc ecc

    Abort non sta facendo quello che ti aspetti che faccia. Guarda la documentazione , è sottile. Chiamare questo metodo di solito termina il thread . Nota la parola di solito e non sempre.

    Sì, l’ Abort non ucciderà mai il thread. Ad esempio se il thread stava eseguendo codice non gestito, CLR non interromperà il thread, ma attenderà che il thread ritorni al codice gestito.

    Sameway Abort non farà il suo lavoro quando thread è in Regione esecuzione vincasting , infine blocchi, ecc.

    Il CLR ritarda l’interruzione del thread per il codice in esecuzione in un CER.

    Ad esempio: prova ad eseguire il seguente codice e vedere cosa succede.

     private void IWillNeverReturn() { Thread thread = new Thread(() => { try { } finally { while (true) { } } }); thread.Start(); Thread.Sleep(1000); thread.Abort(); } 

    Lascia che il thread decida quando dovrebbe terminare, dice al thread che dovrebbe fermarsi il prima ansible. Lo dici usando CancellationToken .

    Se cerchi google per Thread.Abort Evil , troverai molte risorse utili, eccone uno .