problema dichiarazioneCome terminare un thread di lavoro in modo corretto in C#
Ho un thread di lavoro che esegue la scansione fondamentalmente una cartella, entrare nei file al suo interno, e poi dorme per un po '. L'operazione di scansione potrebbe richiedere 2-3 secondi ma non molto di più. Sto cercando un modo per fermare questa discussione elegantemente.
Chiarimento: voglio fermare il filo mentre è dormire, e non mentre è scansione. Tuttavia, il problema è che non so quale sia lo stato corrente del thread. Se sta dormendo, voglio che esca immediatamente. Se è in scansione, voglio che esca dal momento in cui tenta di bloccare.
I tentativi di una soluzione
All'inizio ero usando Sonno e interrupt. Poi ho scoperto che Interrupt non interrompe veramente lo Sleep - funziona solo quando i thread cercano di andare a dormire.
Quindi sono passato a Monitor Attendi & Impulso. Poi ho scoperto che Pulse funziona solo quando sono effettivamente nell'Attesa. Così ora ho una discussione che assomiglia a quella:
while (m_shouldRun)
{
try
{
DoSomethingThatTakesSeveralSeconds();
lock (this)
{
Monitor.Wait(this, 5000);
}
}
catch (ThreadInterruptedException)
{
m_shouldRun = false;
}
}
E ora ho bisogno di creare la mia funzione di arresto. Così ho iniziato con:
public void Stop()
{
m_shouldRun = false;
lock (this)
{
Monitor.Pulse(this);
}
thread.Join();
}
Ma questo non funziona perché io possa essere pulsare mentre le opere di filo (mentre non è in attesa). Così ho aggiunto interrupt:
public void Stop()
{
m_shouldRun = false;
thread.Interrupt();
lock (this)
{
Monitor.Pulse(this);
}
thread.Join();
}
Un'altra opzione è quella di utilizzare:
public void Stop()
{
m_shouldRun = false;
while (!thread.Join(1000))
{
lock (this)
{
Monitor.Pulse(this);
}
}
}
La domanda
Qual è il metodo preferito? C'è un terzo metodo che è preferibile?
"* In un primo momento ero con sonno e interrupt Poi ho scoperto che Interrupt non interrompe veramente il Sonno - funziona solo quando i fili cercano di addormentarsi. * "È strano. È un bug noto? Se non lo è, puoi provare a riprodurlo con un esempio di giocattolo? – Heinzi