2017-03-15 2 views
-5

Zum Beispiel habe ich 10 Aufgaben. Ich möchte x Aufgaben gleichzeitig ausführen. Wenn eine Aufgabe beendet wird, werden weitere Aufgaben zur Ausführung hinzugefügt. Es mag Warteschlangen in Internet Download ManagerSo führen Sie C# -Aufgaben in Sequenz

+0

Ist es eine wichtige Reihenfolge der Ausführung von Aufgaben? Kannst du warten bis alles ausgeführt ist? Bringst du etwas von der Aufgabe zurück? – kat1330

+2

Irgendwelche Forschung zu zeigen? [ask] – MickyD

+3

Verwenden Sie TPL Dataflow. Genau das, was Sie brauchen. –

Antwort

0

Möchten Sie die Aufgaben verketten? Wie in der ersten Aufgabe beendet die zweite Aufgabe?

Sie können ContinueWith() verwenden

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

+0

Verwenden: Parallel.Invoke - MSDN Referenz: https://msdn.microsoft.com/en-us/library/dd537609(v=vs.110).aspx – dan

+0

Nur [Bearbeiten] (http://stackoverflow.com/ Beiträge/42799714/bearbeiten) Ihre Antwort, keine Revisionen als Kommentar – MickyD

+1

Es ist etwas komplexer als das. OP möchte, dass zu jedem Zeitpunkt x Aufgaben gleichzeitig ausgeführt werden. Mit "ContinueWith" müssen Sie die Reihenfolge der Aufgaben vorhersagen –

1

Als Cory Nelson wies darauf hin, das Microsoft.Tpl.Dataflow tut, was Sie brauchen. Beginnen Sie mit der nuget Paket hinzufügen, dann instanziiert eine ActionBlock mit den Einstellungen, die Sie wollen:

var actionBlock = new ActionBlock<string>(new Action<string>(Execute), new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = 10 }); 

Hier wird es rufen Sie die Execute Methode für jede Zeichenfolge einreihen (die Nutzlast könnte sein, etwas anderes, hier gehe ich davon Die Zeichenfolge ist die URL der Datei, die Sie herunterladen möchten. Das ActionBlock stellt sicher, dass nicht mehr als 10 Threads gleichzeitig ausgeführt werden.

Verwenden Sie die Post Methode einige Arbeit einzureihen:

actionBlock.Post("http://.../"); 

Hier ist ein einfaches Proof of Concept:

class Program 
{ 
    private static int ConcurrentActions = 0; 

    public static void Main() 
    { 
     var actionBlock = new ActionBlock<string>(new Action<string>(Execute), new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = 10 }); 

     for (int i = 0; i < 20; i++) 
     { 
      actionBlock.Post(i.ToString()); 
     } 

     actionBlock.Complete(); 

     while (!actionBlock.Completion.IsCompleted) 
     { 
      Console.WriteLine("Concurrent actions: {0}", ConcurrentActions); 

      Thread.Sleep(200); 
     } 

     Console.WriteLine("Done"); 
     Console.ReadLine(); 
    } 

    private static void Execute(string url) 
    { 
     Interlocked.Increment(ref ConcurrentActions); 

     Thread.Sleep(1000); // Workload 

     Interlocked.Decrement(ref ConcurrentActions); 
    } 
} 
+0

Danke. Genau das möchte ich. –

0

Beispiele, ich habe 10 Aufgaben. Ich möchte X-Aufgaben gleichzeitig ausführen

Dies ist ein Nebenläufigkeitsdrosselungsszenario.

Wenn von „Aufgabe“, Sie einige CPU-gebundene Code bedeuten, die Sie ausführen wollen (das heißt, jede „Aufgabe“ ist synchrone in der Natur), dann wird das entsprechende Werkzeug wäre DegreeOfParallelism zu setzen auf ein Parallel oder PLINQ Ruf, so etwas wie:

data.AsParallel().WithDegreeOfParallelism(x).Select(d => ...).ToList(); 

Wenn von „Aufgabe“, meinen Sie eine tatsächliche Task (das heißt, jede „Aufgabe“ ist asynchrone in der Natur), dann wird das entsprechende Werkzeug wäre ein zu verwenden, SemaphoreSlim mit Task.WhenAll, etwas wie:

Alternativ könnten Sie use TPL Dataflow, die mit synchronen oder asynchronen "Task" s arbeiten.

Verwandte Themen