2017-02-10 4 views
0

Ich habe eine Schleife mit vielen Interaktionen laufen, so dachte ich, Fäden, aber ich weiß nicht, wie die Anzahl der Thread zu steuern:Limit Anzahl der Threads C#

for (int i = 0; i < 45856582; i = i + 10000) 
{ 
    string result = request.Get(String.Format(mold, i)); 
    Worker temp = new Worker(i, i + 10000); 
    Thread th = new Thread(new ThreadStart(temp.DoWork)); 
    th.Start(); 
} 

Diese Schleife würde zu viele Threads erstellen , wie kann ich es so machen, dass die Schleife aufhört und nicht mehr Threads erzeugt als eine bestimmte Anzahl und warten, bis einer der erzeugten Threads fertig ist, um fortzufahren?

Dies ist der Arbeiter-Klasse:

public class Worker 
{ 
    int startIndex = 0; 
    int endIndex = 0; 

    public Worker(int startIndex , int endIndex) 
    { 
     this.startIndex = startIndex; 
     this.endIndex = endIndex; 
    } 

    public void DoWork() 
    { 

     for (int i = startIndex; i < endIndex; i++) 
     { 
      // Do Work 
     } 
    } 
} 
+1

Sie könnten eine ['Task'] (https://msdn.microsoft.com/en-us/library/system. threading.tasks.task (v = vs.110) .aspx) anstatt Threads explizit zu verwalten. –

+0

vielleicht ThreadPool oder Parallel-Klassen? Normalerweise machen sie automatisch gute Arbeit mit Threads Count – Disappointed

+1

Ich würde auf jeden Fall auf ['Parallel'] (https://msdn.microsoft.com/en-us/library/system.threading.tasks.parallel (v = vs .110) .aspx) 'For' oder' ForEach' hier. –

Antwort

6

Ich würde vorschlagen, dass Sie Ihren gesamten Code ändern, um die Parallel Klasse zu verwenden:

https://msdn.microsoft.com/en-us/library/dd781401(v=vs.110).aspx

// Options to the set maximum number of threads. 
// This is not necessary, .NET will try to use the best amount of cores there is. (as pointed out by Panagiotis Kanavos) 
// Overload of method is available without the options parameter 
var options = new ParallelOptions() 
{ 
    MaxDegreeOfParallelism = 4 // maximum number of threads 
}; 

const int batchSize = 1000; 
int totalSize = 45856582; 
int loops = totalSize/batchSize; 

// if there is a rest in the division (in this case 582) 
// then add an extra loop 
if(totalSize % batchSize != 0) 
    loops++; 

// The body on the loop 
Action<int> loopBody = i => 
{ 
    Worker temp = new Worker(i * batchSize, i * batchSize + batchSize); 
    temp.DoWork(); 
}; 

// The result. Check for loopResult.IsCompleted if everything went correctly 
var loopResult = Parallel.For(0, loops, options, loopBody); 

Oder Sie könnten eine Überladung der Methode verwenden, um das Abbrechen usw. zu unterstützen.

+0

Der Standard von so vielen Aufgaben, wie es Kerne gibt, ist die meiste Zeit geeignet. Der DOP sollte nur gesetzt werden, wenn eine Drosselung erforderlich ist oder wenn bekannt ist, dass die Aufgaben Verzögerungen aufweisen, z. B. Web-Anfragen. –

+0

Stimmt, er hat nach einer bestimmten Nummer gefragt ... Aber einverstanden. Wird einen Kommentar in meinem Code machen – SynerCoder

+0

@PanagiotisKanavos Geändert – SynerCoder

1

Versuchen Parallel.For: https://msdn.microsoft.com/en-us/library/dd460713(v=vs.110).aspx

ParallelOptions options = new ParallelOptions(); 
options.MaxDegreeOfParallelism = 10; //max threads 

Parallel.For(0, 45856582, options, i => { 
    Worker temp = new Worker(i, i + 10000); 
    temp.DoWork(); 
}); 
+1

Ihr Code wird mehrere Male ausgeführt. Ihr Code wird 10000 Lose insgesamt 45856582 Mal durchführen. Nicht der Plan, den ich denke – SynerCoder

+0

Ihr Recht, sollte im Großen und Ganzen in die richtige Richtung zeigen, anstatt den Code für ihn zu schreiben! sollte der Vorbehalt in der Antwort angegeben werden. –

Verwandte Themen