Heim  >  Artikel  >  Backend-Entwicklung  >  C# implementiert die Thread-Pool-Funktion selbst (2)

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

黄舟
黄舟Original
2016-12-27 14:37:351517Durchsuche

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;

Fügen Sie zwei Variablen zur ThreadPoolManager-Klasse hinzu

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


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


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


86f15ad36d944fa5fd07d3b7f5ce6c99vcD4KPGgxPre9t6i2/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)!



Stellungnahme:
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