2016-09-03 5 views
0

In meinem Projekt muss ich viel in einer foreach-Schleife tun, die ich 6-7 Stunden warten muss.Wie wird Multi-Thread in C# verwendet?

zum Beispiel: Ich habe 80 docs => ca. 8 Stunden überprüfen

foreach (var doc in docs) 
{ 
    bool valid = checkIsValid(doc); // about 2 min per doc 
    if (vaid) 
    { 
     doThing(doc); // about 5 min per doc 
    } 
    else 
    { 
     delete(doc); // about 20s per doc 
    } 
} 

Also, ich betrachten kann ich diese Dinge in der gleichen Zeit überprüfen, die ich viele Ressourcen verwendet nicht, wenn der Lauf über dem Code. Und ich finde, C# hat eine Multithread-Funktion (ich weiß nicht, was es bieten kann).

Kann ich es in meinem Projekt verwenden? Wie benutze ich es in meinem Projekt?

ideal: 80 Dokumente werden zur gleichen Zeit eingecheckt und die foreach-Schleife wird beendet, wenn 80 Threads gestorben sind.

foreach (var doc in docs) 
{ 
    //new thread start 
    bool valid = checkIsValid(doc); // about 2 min per doc 
    if (vaid) 
    { 
     doThing(doc); // about 5 min per doc 
    } 
    else 
    { 
     delete(doc); // about 20s per doc 
    } 
    //thread die 
} 
+1

Haben Sie versucht, Parallel.ForEach (https://msdn.microsoft.com/en-us/library/system .threading.tasks.parallel.foreach (v = vs.110) .aspx)? –

+0

@DovydasSopa Nein, habe ich nicht. ich werde es prüfen. Danke –

+1

80 Threads werden die CPU hoggen, wenn Sie 80 Kerne haben. Sie sollten * Multithreading lernen *, bevor Sie etwas versuchen, es ist sehr leicht, es falsch zu verstehen. Haben Sie die Komplexität Ihrer aktuellen Algorithmen überprüft? 20 Sekunden, um etwas zu löschen, scheint * riesig *. –

Antwort

2

Haben Sie sich Parallel.ForEach angesehen? Ihr Code würde wie folgt aussehen:

Parallel.ForEach(docs, doc => { 
    if (checkIsValid(doc)) 
     doThing(doc); 
    else 
     delete(doc); 
}); 
+0

Welche Ressource wird verwendet? Lucas sagte Multithreading kostet CPU-Ressource .. Wie wäre es parallel? –

+0

Gleiche CPU- und Speicherressourcen. Nur du wirst nicht so viel Code selbst schreiben müssen. –

+0

Ist es gefährlich, wenn ich versuche, etwas aus dem Internet (3 ~ 4 MB) in Parralel.ForEach Schleife zu downloaden? –

1

es mehr Möglichkeiten gibt, Concurrency in C# zu erreichen, aber die Zeit, die von jedem Verfahren genommen, hängt von der Anzahl des Kerns Sie haben. 'Parallel.ForEach' ist eine Option und wahrscheinlich der einfachste Weg, um zu erreichen, aber beachten Sie, dass es versuchen wird, Ihre Arbeitsaufgabe wo möglich zu brechen und die Ausführung zu beschleunigen.

Der folgende Code soll Multithreading haben, aber seien Sie vorsichtig 80 Threads könnten ein Overkill sein. So erstellen Aufgaben (Threads) unter gebührender Berücksichtigung

foreach (var doc in docs) 
{ 
    //new thread start 
    bool valid = checkIsValid(doc); // about 2 min per doc 
    if (vaid) 
    { 
     Task.Factory.StartNew(() => doThing(doc); 
    } 
    else 
    { 
     delete(doc); // about 20s per doc 
    } 
    //thread die 
} 

Aufgaben im Rahmen arbeiten 4 und höher

+0

Ist Ihre Lösung besser als die Verwendung von Parallel.ForEach, wenn doThing (string doc) (Datei aus dem Netzwerk herunterladen => es bearbeiten => ersetzen) und löschen (string doc) das Dokument auf der Host-Site löscht. –

+0

Es gibt immer eine Debatte zwischen Parallel.ForEach und Tasks. So wie ich es sehe ist die erste automatisch und die Aufgaben werden vom Benutzer explizit ausgeführt. Sie müssen beide Optionen ausprobieren und die CPU und die Ausführungszeit überwachen, um die Entscheidung zu treffen. Ich habe Ihnen 2 Optionen zur Verfügung gestellt, um schneller Ergebnisse zu erzielen als Ihre aktuelle Lösung. – snit80

+0

Wenn mein Server nicht 80 Threads gleichzeitig verarbeiten kann. Kann ich zuerst von ihnen weglaufen und dann andere ausführen? Beispielsweise werden nur 4 Threads gleichzeitig ausgeführt. –

Verwandte Themen