C# implementiert die Thread-Pool-Funktion selbst (2)

黄舟
Freigeben: 2016-12-27 14:37:35
Original
1516 Leute haben es durchsucht

Einführung

Im vorherigen Artikel implementiert C# die Thread-Pool-Funktion selbst (1). Wir haben im Grunde ein Programm implementiert, das ausgeführt werden kann, aber nicht wirklich als Thread-Pool bezeichnet werden kann. Da der Code im vorherigen Artikel einen schwerwiegenden Fehler aufweist, bedeutet dies, dass er nicht wartet, sondern eine verrückte While-Schleife ausführt und versucht, die Aufgabenliste zu sperren Die Leistung ist ziemlich gering und die Reaktionsgeschwindigkeit des Programms ist sehr langsam (wenn eine neue Aufgabe hinzugefügt wird, dauert es lange, bis der Job ausgeführt wird), den ich gerade erwähnt habe.

Um dieses Problem zu lösen, müssen wir eine Methode verwenden, die es dem Programm ermöglicht, den Prozess zu synchronisieren.

Methode 1

Verwenden Sie ein Semaphor

Um den Sperrvorgang der Aufgabe zu reduzieren, führen wir Tests nur durch, wenn die Aufgabe nicht leer ist. Unser Semaphor stellt die Nummer in der Aufgabentabelle dar. Wenn s.WaitOne(); erfolgreich ist, beginnen wir mit dem Sperren und Entfernen der Aufgabe

while (flag && TaskQueue != null)
            {
                //等待任务
                ThreadPoolManager.s.WaitOne();
                //获取任务
                lock (TaskQueue)
                {
                    try
                    {
                        if (TaskQueue.Count > 0)
                            task = TaskQueue.Dequeue();
                        else
                            task = null;
                    }
                    catch (Exception)
                    {
                        task = null;
                    }
                    if (task == null)
                        continue;
Nach dem Login kopieren

Fügen Sie zwei Variablen zur ThreadPoolManager-Klasse hinzu

//由于采用信号量需要定义一个
        public int MaxJobNum = 1000;
        public static Semaphore s;
Nach dem Login kopieren


und initialisieren Sie das Semaphor s = new Semaphore(0, MaxJobNum);


<🎜 beim Initialisieren dieser Klasse >Auf diese Weise erfolgt die Synchronisierung erreicht werden kann

Eine Testklasse ist unten angegeben

static void Main(string[] args)
       {
           ThreadPoolManager tpm = new ThreadPoolManager(2);
 
           TestTask t1 = new TestTask("task1");
           TestTask t2 = new TestTask("task2");
           TestTask t3 = new TestTask("task3");
           TestTask t4 = new TestTask("task4");
           TestTask t5 = new TestTask("task5");
           TestTask t6 = new TestTask("task6");
           TestTask t7 = new TestTask("task7");
           TestTask t8 = new TestTask("task8");
           TestTask t9 = new TestTask("task9");
 
           tpm.AddTask(t1);
           tpm.AddTask(t2);
           tpm.AddTask(t3);
           tpm.AddTask(t4);
           tpm.AddTask(t5);
           tpm.AddTask(t6);
           tpm.AddTask(t7);
           tpm.AddTask(t8);
           tpm.AddTask(t9);
       }
Nach dem Login kopieren


< 喎�"/kf/ware/ vc/" Ziel ="_blank" class="keylink">vcD4KPGgxPre9t6i2/jwvaDE+Cs7Sw8eyu8rH08PQxbrFwb+jrM7Sw8fKudPDQXV0b1Jlc2V0RXZlbnTAtMq1z9bNrLK9Cjxicj4KCrXa0ruyvaOs1NpUaHJ. lyWRQ b29sTWFuYWdlcrP1yry7r8qxuvK0tL2o0ru49iAgbG9ja3MgPSBuZXcgQXV0b1Jlc2V 0RXZlbnQoZmFsc2UpOwq1sUFkZFRhc2u1xMqxuvJsb2Nrcy5TZXQoKTvNqNqNaqtci0/bXEstnX 96GjCsi7uvPO0sPHttRXb3JrVGhyZWFktcRydW66r8r91/bSu7j20KHQobXE0N64xAo8cHJlIGNsYXNzPQ=="brush:java;"> public void run() { while (flag && TaskQueue != null ) { //Warten auf Aufgaben//ThreadPoolManager.sep.WaitOne(); //Warten auf Aufgaben while (TaskQueue.Count == 0 && flag) { try { ThreadPoolManager.locks.WaitOne( } Catch (Exception) { } } //Aufgabensperre abrufen (TaskQueue) { try { task = TaskQueue(); } Catch (Exception) { task = null; } if (task == null) continue; task .StartTask(); } Catch (Exception) { } try { if (!task.IsEnd()) { task.SetEnd(false); of while }Nur wenn die Anzahl der Aufgabenlisten 0 ist, werden wir blockieren und fortfahren, bis AddTask

Das Obige ist der Inhalt der c#-eigenen Implementierung der Thread-Pool-Funktion (2). Weitere verwandte Inhalte finden Sie hier Achten Sie auf PHP Chinese Net (www.php.cn)!



Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!