Verwalten von threads mit List<Thread>

Ich versuche, die Implementierung eines Multithreading in c#.

Die Grundidee ist:

  1. Gibt es eine Menge thread-Prozess aufrufen einer Funktion, und jeder thread endet nicht in der Reihenfolge, wie Sie aufgerufen werden.
  2. Ich möchte die maximale Anzahl von Threads ausgeführt wird.
  3. Wenn ein thread fertig ist, möchte ich nennen, einen anderen thread, bis alles erledigt ist.

So, dies umzusetzen, nutze ich eine Liste der Faden. Für jede Sekunde, die ich überprüfen, ob die Liste bereits voll ist, und wenn es einen thread damit beendet.

Hier ist mein code:

List<Thread> threadCompany = new List<Thread>();
List<Thread> fireThisGuy = new List<Thread>();
while (i < _finish) {
    if (threadCompany.Count < _MAX_THREAD) {
        Thread worker = new Thread(delegate() {
            CallFunction(i);
        });

        threadCompany.Add(worker);
        i++;
        worker.Start();
    }

    Thread.Sleep(1000); //Wait for a while instead of keep calling if

    foreach (Thread worker in threadCompany) { 
        if (!worker.IsAlive) {
            fireThisGuy.Add(worker); //because threadCompany may not be 
                                     //modified in iteration.
        }
    }

    foreach (Thread worker in fireThisGuy) {
        threadCompany.Remove(worker);
    }
    fireThisGuy.Clear();
}

Dies funktioniert, aber ich glaube nicht, ich bin elegant und effizient hier, wie kann ich meinen code?

Verwenden ThreaPool und/oder TPL (Fx-4).
Ich denke, es gilt zu tun, wie Sie tun. Nur eine änderung zu löschen, die schlafen. Fügen Sie eine andere Liste als queue. Wenn der thread-Unternehmen Liste voll ist, fügen Sie es der Liste "Warteschlange" statt. Dann fügen Sie ein Ereignis, um die Arbeiter, die ausgelöst wird, wenn das Paket abgeschlossen ist. Starten Sie dann den nächsten Auftrag in der Warteschlange. Alles wird getan, wenn die threads in der thread-Unternehmen Liste sind alle finihed und die Warteschlange leer ist.
es ist nur 1241912901 Möglichkeiten, um dieses Durcheinander, wenn Sie mit Ihrem eigenen thread-pool-Implementierung.

InformationsquelleAutor EwyynTomato | 2011-11-06

Schreibe einen Kommentar