2013-01-31 11 views
8

Domyślnie pula wątków w .NET działa z wątkami tła.Czy mogę sprawić, aby moja pula wątków tworzyła wątki jako pierwszy plan?

Nie mogę go zmienić, aby działał jako pierwszy plan.

Jak to zmienić, aby działał jako wątek na pierwszym planie?

Edit:

muszę korzystać z tego powodu ja zmieniam należytej przetwarzania duża ilość aplikacji (przed nim byłem ręcznie obsługi wątków, które są pierwszoplanowe te domyślnie), a ja nie chcę zmienić mój wniosek tylko w celu dostosowania go do scenariusza tło nawlekania ..

Zastanawiam się dlaczego puli wątków nie jest nowej wiedzy domyślnie

+3

Chcesz, aby były na pierwszym planie, aby zapobiec przerwaniu procesu? Możesz zachować liczbę referencyjną określającą liczbę aktywnych wątków w tle, które nie kończą głównego wątku (prawdopodobnie pierwszego planu, interfejsu użytkownika), dopóki liczba nie osiągnie zera. –

+3

@jeffamaphone +1. Pachnie: "Nie wiem, jak to właściwie zaprogramować, więc biorę młotek i jakoś go używam, nadużywając wszystkiego, czego nie wiem". – TomTom

+0

Cóż, nie chcę zakładać zbyt wiele, ale wolę pytania, które obejmują: * dlaczego * chcesz coś zrobić, ponieważ często istnieje lepszy sposób, który wynika z doświadczenia. –

Odpowiedz

16

Pojęcie "wątku tła" oznacza bardzo trochę w .NET. Właściwość Thread.IsBackground jest po prostu prostą flagą, która pomaga środowisku CLR decydować, czy powinien on niegrzecznie przerwać wątek, gdy AppDomain zostanie rozładowany, czy powinien poczekać, aż wątek zostanie opuszczony dobrowolnie.

Możesz po prostu zmienić właściwość, jeśli chcesz, aby wątek puli wątków działał przy wyjściu programu. Ten fragment pokazuje, jak to jest możliwe:

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 
    } 
} 

Trzymaj tu swoje oczy. Jeśli jest to dla ciebie ważne, istnieje duże prawdopodobieństwo, że robisz coś złego.

0

nie wierzę można, trzeba będzie wymyślić zwyczaju ThreadPool, aby to zrobić.

Gwinty w zarządzanej puli wątków są wątkami tła. Oznacza to, że ich właściwości IsBackground są prawdziwe. Oznacza to, że wątek ThreadPool nie będzie utrzymywał aplikacji uruchomionej po zakończeniu wszystkich wątków pierwszoplanowych.

Kiedy nie używać wątek Basen wątki

Istnieje kilka scenariuszy, w których wskazane jest, aby utworzyć i zarządzać swoimi wątki zamiast korzystania wątki puli wątków:

  • wymagany jest pierwszy wątek.

From this link And This One

2

Możesz można ustawić wątki puli nici jako pierwszy plan.

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"); 
Powiązane problemy