2013-01-31 4 views
8

Per impostazione predefinita, il pool di thread in .NET funziona con thread in background.Posso creare il mio pool di thread per creare i thread come primo piano?

Non riesco a modificarlo per eseguire come primo piano.

Come posso cambiarlo per l'esecuzione come thread in primo piano?

Edit:

ho bisogno di usare questo perché sto cambiando il mio App a causa di elaborazione ad alto volume (prima che mi stava gestendo manualmente le discussioni, che sono quelli di primo piano per impostazione predefinita), e io non voglio cambiare la mia applicazione solo per adattarlo ad uno scenario di sfondo filettatura ..

mi chiedo perché piscina thread non è in primo piano per impostazione predefinita

+3

Vuoi che siano in primo piano per impedire la chiusura del tuo processo? È possibile mantenere un conteggio di riferimenti su quanti thread di sfondo attivi si hanno e non terminare il thread principale (presumibilmente in primo piano, UI) finché il conteggio non raggiunge lo zero. –

+3

@jeffamaphone +1. Odora di "Non so come programmarlo correttamente, quindi prendo un martello e in qualche modo lo faccio funzionare, abusando di tutto ciò che non conosco". – TomTom

+0

Beh, non voglio dare troppo per scontato, ma preferisco le domande che includono * perché * vuoi fare qualcosa, poiché spesso c'è un modo migliore che deriva dall'esperienza. –

risposta

16

La nozione di un "thread in background" significa molto poco in .NET. La proprietà Thread.IsBackground è solo un semplice flag che consente al CLR di decidere se interrompere bruscamente il thread quando AppDomain viene scaricato o se deve attendere il thread per uscire volontariamente.

È possibile modificare la proprietà solo se si desidera che un thread del pool di thread continui a essere in esecuzione all'uscita del programma. Questo snippet mostra come è possibile:

using System; 
using System.Threading; 

class Program { 
    static void Main(string[] args) { 
     var sync = new ManualResetEvent(false); 
     ThreadPool.QueueUserWorkItem((_) => { 
      Console.WriteLine("Running"); 
      Thread.CurrentThread.IsBackground = false; 
      sync.Set(); 
      Thread.Sleep(5000); 
      Console.WriteLine("Done, should exit now"); 
      Thread.Sleep(250); 
     }); 
     sync.WaitOne(); // Ensures IsBackground is set 
    } 
} 

Tieni gli occhi sulla palla qui. Se questo è importante per te allora c'è un'alta probabilità che stai facendo qualcosa di sbagliato.

0

io non credo che si possa, si dovrà venire con un costume ThreadPool per fare questo.

I thread nel pool di thread gestiti sono thread in background. Cioè, le loro proprietà IsBackground sono vere. Ciò significa che un thread ThreadPool non manterrà un'applicazione in esecuzione dopo che tutti i thread in primo piano sono stati interrotti.

quando non usare Discussione Piscina Threads

Ci sono diversi scenari in cui è opportuno creare e gestire i propri thread, invece di utilizzare pool di thread discussioni:

  • avete bisogno di un filo in primo piano.

From this link And This One

2

È possibile impostare thread thread di thread come foreground.

class Program 
{ 
    static void Main(string[] args) 
    { 
     new Action(() => Worker()).BeginInvoke(null,null); 

     Thread.Sleep(1000); 
     Console.WriteLine("Main ends here"); 
    } 

    static void Worker() 
    { 
     Thread.CurrentThread.IsBackground = false; 

     Console.WriteLine("Worker started. Bg {0} Tp {1}.", 
      Thread.CurrentThread.IsBackground, 
      Thread.CurrentThread.IsThreadPoolThread); 

     Thread.Sleep(5000); 
     Console.WriteLine("Worker ends here");