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);
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); }
< 喎�"/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