1. Introduktion till ThreadPool

En samling av förkonfigurerade trådar som sitter vid liv för att betjäna inkommande asynkron uppgift kallas ”ThreadPool” . Namnområdet "System.Threading" innehåller klassen ThreadPool som har många statiska funktioner för att skapa och använda ThreadPool .

ThreadPool förbättrar programmets lyhördhet. För att förklara detta, låt oss tänka på Yahoo Mail-inloggningssida . Tänk på att det kommer att finnas hundratals användare över hela världen som vill logga in på kort tid (5-10 sekunder) för att kontrollera deras e-postmeddelanden. Webbservern tilldelar en tråd för varje användare för att kontrollera sina referenser mot databasen. Men att skapa tråd, tilldela referenskontrolluppgiften och rengöra tråden är tidskrävande när det finns flera inloggningsförfrågningar varje sekund. Webbservern undviker att skapa en tråd och rengöra tråden för varje begäran genom att använda ThreadPool .

ThreadPool upprätthåller ett visst antal trådar i ThreadPool och när det finns en inkommande uppgift (Gilla, Login-begäran i Yahoo Exempel) tilldelar det till en tråd i ThreadPool. När den tilldelade uppgiften är klar kommer tråden tillbaka till ThreadPool utan att förstöra den så att den är lätt tillgänglig för nästa inkommande uppgift. Detta visas nedan:

C # Threads and ThreadPool |

2. ThreadPool-stöd i C #

C # framework ger ThreadPool- klassen för att skapa poolen av trådar och tilldela uppgifter till den. Metoden “QueueUserWorkItem ()” används för att skicka uppgiften till ThreadPool. Metoderna "SetMaxThreads ()" och "SetMinThreads ()" används för att kontrollera ThreadPools belastning. I det här exemplet kommer vi att skapa 50 räkneuppgifter och gå i kö till en ThreadPool.

Att ställa in ThreadPool-storlek kräver mycket experiment för att upprätthålla systemstabiliteten. I det här exemplet lämnar vi det till DotNet CLR.

3. Uppgift för trådarna i ThreadPool

Vi vet att vi kommer att skapa ThreadPool och kommer att stå i kö 50 uppgifter till det. Vad är uppgiften? Uppgiften är att räkna siffrorna och skriva ut dem i konsolutgångsfönstret. Titta på koden här nedan.

 // Exempel 02: Definiera uppgift / vänta återuppringningsfunktion privat statiskt tomrum TaskCallBack (Objekt ThreadNumber) {string ThreadName = "Thread" + ThreadNumber.ToString (); för (int i = 1; i <10; i ++) Konsol.WriteLine (trådnamn + ":" + i.ToString ()); Console.WriteLine (trådnamn + "klar ..."); } 

Här är TaskCallBack den funktion som bara är den uppgift som vi kommer att stå i kö till ThreadPool . Denna tråduppgiftsfunktion får en parameter för att namnge uppgift eller tråd. I den verkliga världen är parametern packad med de data som krävs för att uppgiften är klar. I vårt exempel startar vi en slinga som körs tio gånger och skriver ut räkningen. När räkningen är klar skriver vi ut att uppgiften som tilldelats för tråden är klar.

Kom ihåg att vi kommer att stå i kö 50 uppgifter från huvudtråden och titta på hur ThreadPool fungerar i köuppgiften.

4. I köuppgifter till ThreadPool

Vår uppgiftsfunktion är klar. Nu i huvudfunktionen (), kommer vi att köra uppgifterna en efter en. Titta på kodavsnittet nedan:

I köuppgifter till C # ThreadPool |

Vi kör ett För Loop som körs 50 gånger. I varje iteration står vi i en kö till ThreadPool. Funktionen QueueUserWorkItem () (markerad som 1) tar "WaitCallback Delegate" som parameter. Kodavsnittet som är markerat som 2 visar att vi passerar uppgiftsfunktionen som skapades i föregående avsnitt som parameter för att skapa delegaten. Den andra parametern (markerad som 3) som skickas till QueueUserWorkItem kommer att skickas som ett argument till vår " Task Callback-funktion" av ThreadPool.

Vi vidarebefordrar Loop-räknaren som det andra argumentet och uppgiftsfunktionen kastar det till ett heltal för att bilda trådnamnet. Observera att vi ringer till Thread.Sleep (10000) på huvudtråden. Detta samtal kommer att se till att Main Thread som stod i kö 50 uppgifter till ThreadPool inte kommer att sluta omedelbart. Sömnen bör dock justeras för systemförhållanden. Det bästa sättet att vänta är genom händelser som vi kommer att se i en separat artikel.

När jag kör provapplikationen får jag nedanstående provutgång (utdata varierar beroende på systemvillkor):

ThreadPool C # Programutgång |

I utgången kan vi se hur trådarna körs från poolen. Ovanstående är bara en provutgång med en enda testkörning. Utgången kommer inte att vara densamma när vi kör den nästa gång. Säg till exempel, i vår första körning ser vi att tråd 45 slutade sist. Men i en annan körning kan du se olika trådstag sist.

Exempel på fullständig kod ges nedan:

Exempel på C # ThreadPool komplett kod

 använder System; med hjälp av System.Collections.Generic; med System.Text; // Exempel 01: Nödvändigt namnutrymme med hjälp av System.Treading; namespace Thread_Pool {class Program {// Exempel 02: Definiera uppgift / vänta återuppringningsfunktion privat statisk tomrum TaskCallBack (Objekt ThreadNumber) {string ThreadName = "Thread" + ThreadNumber.ToString (); för (int i = 1; i <10; i ++) Konsol.WriteLine (trådnamn + ":" + i.ToString ()); Console.WriteLine (trådnamn + "klar ..."); } static void Main (string [] args) {// Sample 03: Create Thread Pool for (int task = 1; task <51; task ++) ThreadPool.QueueUserWorkItem (new WaitCallback (TaskCallBack), uppgift); Thread.sleep (10 tusen); }}}