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
Antwort
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
Verwenden: Parallel.Invoke - MSDN Referenz: https://msdn.microsoft.com/en-us/library/dd537609(v=vs.110).aspx – dan
Nur [Bearbeiten] (http://stackoverflow.com/ Beiträge/42799714/bearbeiten) Ihre Antwort, keine Revisionen als Kommentar – MickyD
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 –
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);
}
}
Danke. Genau das möchte ich. –
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.
- 1. So führen Sie geordnete Aufgaben in Maven2 Build aus
- 2. Wie führen Sie mehrere Aufgaben in C# aus und erhalten ein Ereignis nach Abschluss dieser Aufgaben?
- 3. Wie Alias eine Sequenz von Aufgaben?
- 4. eine Sequenz von parallelen Aufgaben
- 5. So drucken Sie vordefinierte Sequenz in Python
- 6. So führen Sie Hintergrundaufgaben in ASP.NET aus
- 7. Schienen führen Aufgaben Async in Controller
- 8. So erhöhen Sie die Anzahl der parallelen Aufgaben in C#
- 9. Führen Sie RSpec Aufgaben in einer bestimmten Reihenfolge
- 10. Führen Sie die Aufgaben in einem Knoten zweimal aus
- 11. Gruppieren Sie Jobs in Jenkins oder Serialisieren Sie sie oder führen Sie sie in Sequenz
- 12. Führen Sie einige Aufgaben in IPython Notebook im losgelösten Modus
- 13. Führen Sie Aufgaben in mehreren Threads auf node.js
- 14. So führen Sie ASCII-Subtraktion in Java
- 15. So führen Sie eine schnelle Web-Anfrage in C#
- 16. So teilen Sie eine Sequenz in Scala
- 17. So führen Sie PowerShell in CMD aus
- 18. So führen Sie mehrere Mischaufgaben in einem Befehl aus
- 19. So führen Sie Tasks in MSBuild parallel aus
- 20. So führen Sie Sequelize Join
- 21. So führen Sie Flex-Proben
- 22. So führen Sie Spezifikationen sequenziell
- 23. So führen Sie die interne Abwicklungsfunktion aus:
- 24. Führen Sie eine Asynchron-Aufgaben Haufen, wenn eine bestimmte Ausführungsreihenfolge
- 25. So führen Sie eine Einfügung in select
- 26. So führen Sie Validierungen in angular2 durch
- 27. So führen Sie eine Rasterberechnung in R
- 28. So führen Sie JavaScript in WebStorm
- 29. So führen Sie LDAP-Authentifizierung in Perl
- 30. So führen Sie Shell-Befehl in Javascript
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
Irgendwelche Forschung zu zeigen? [ask] – MickyD
Verwenden Sie TPL Dataflow. Genau das, was Sie brauchen. –