Domanda

c'è un modo per annullare thread creati con QueueUserWorkItem?

O forse non ne ho bisogno?Cosa succede se l'applicazione principale e le uscite?Sono tutti thread creato da interrotta automaticamente?

È stato utile?

Soluzione

Non hai bisogno di terminarli.Quando l'applicazione termina, .NET uccide qualsiasi thread con IsBackground = true.L' .NET threadpool ha tutti i suoi thread impostato IsBackground = true, in modo da non dovete preoccuparvi di questo.

Ora, se si sta creando discussioni newing la classe Thread, quindi è necessario per terminarli o impostare i IsBackground proprietà su true.

Altri suggerimenti

Tuttavia, se si sta utilizzando non gestito risorse in quei thread, è possibile finire in un sacco di guai.

Che sarebbe piuttosto dipende come sono stati utilizzati, se queste risorse non gestite correttamente sono stati avvolti sarebbero trattati da loro wrapper finalizzazione indipendentemente dal meccanismo utilizzato per uccidere i thread che aveva fatto riferimento a loro. E le risorse non gestite sono liberato dal sistema operativo quando un'app esce comunque.

C'è una sensazione generale che (Windows) applicazioni di spendere troppo tempo cercando di clean-up su app arresto - che spesso coinvolgono paging in una enorme quantità di memoria solo in modo che si può essere scartato di nuovo (o di paging di codice che gira intorno a liberare unmangaged oggetti che il sistema operativo tratterebbe comunque).

Il threadpool utilizza i thread in background.Quindi, tutti essere chiuso automaticamente quando l'applicazione si chiude.

Se si desidera interrompere un thread a voi stessi, dovrete gestire il thread te (così si può chiamare Thread.Abort() sull'oggetto del thread) o si dovrà impostare una qualche forma di meccanismo di notifica che vi permetterà di stabilire il thread che dovrebbe interruzione stessa.

Sì.Tuttavia, se si utilizza risorse non gestite in quei thread, si potrebbe finire in un sacco di guai.

sì, essi sono in background, ma f.ex se si dispone di applicazione in cui si utilizza ThreadPool per alcuni un pò più di scaricamento o di roba, e si desidera interrompere il loro, come si fa a smettere ?il mio suggerimento sarebbe:uscita thread al più presto, f.ex

bool stop = false;
void doDownloadWork(object s) 
{
   if (!stop)
   {
       DownloadLink((String)s, location);
   }
}

e se si imposta interrompere = true, la seconda (in coda) thread si chiude automaticamente, dopo il thread di coda termina processo.

Secondo Lukas Šalkauskas' risposta.

Ma si deve usare:

volatile bool stop = false;

a dire il compilatore di questa variabile è utilizzata da più thread.

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