Mein Ziel ist es, mehrere Verknüpfungen gleichzeitig zu laden und für jede eine Aufgabe zu erstellen.C# Mehrere Tasks ausführen, die die Website analysieren und zurückgeben, wenn alle fertig sind
Die Task ruft eine asynchrone Methode auf, die die Links analysiert und Sublinks zurückgibt, die im Gegenzug geparst werden (mit WebBrowser) und dann einen Downloadlink zurückgeben.
Die erste asynchrone Methode ruft 2 nachfolgende Methoden für diese Arbeit auf.
Mein Problem ist Task.Factory.ContinueWhenAll würde nur zurück, wenn die erste Methode beendet, und wird nicht auf den Rest der Arbeit warten. Ich möchte nur fortfahren, wenn ich alle Download-Links bereit habe, die möglicherweise mehrere Webseiten-Parsing benötigen, bevor sie es sind.
Derzeit mein Code ist folgende:
var tasks = new List<Task>();
for (var index = 0; index < items_checklist.CheckedItems.Count; index++)
{
var item = items_checklist.CheckedItems[index];
Task task = Task.Factory.StartNew(
() => GetMirrors(((Item) item).Value, ((Item) item).Text)
, CancellationToken.None
, TaskCreationOptions.None
, TaskScheduler.FromCurrentSynchronizationContext()
);
tasks.Add(task);
}
Task.Factory.ContinueWhenAll(tasks.ToArray(), GetLinks_Finished =>
{
SetLinksButtonText(@"Links Ready");
SetLinksButtonState(false);
SetDownloadButtonState(true);
Cursor.Current = DefaultCursor;
});
Diese zurückkehren wird, wenn alle GetMirrors beenden, aber GetMirrors nennen würde „tempbrowser_DocumentCompleted“ (WebBrowser complete-Ereignis), die wiederum nennen würde „LoadLinkIntoQueue“, um den Download-Link zu laden in die Warteschlange.
Ich möchte ContinueWhenAll fortsetzen, wenn alle LoadLinkIntoQueue ausgeführt werden.
Was fehlt mir an Logik?
Ich weiß nicht, ob es dafür Unterstützung gibt. Wenn nicht, müssen Sie einen Zähler für die Anzahl der laufenden Threads erstellen. Fügen Sie allen abschließenden Aufgaben eine Fortsetzung hinzu, die den Zähler nur dekrementiert. Und feuert die letzte Logik, die es nach der finalen letzten Aufgabe haben sollte. – Christopher
Dies klingt wie ein Job für [Dataflow] (https://blog.stephencleary.com/2012/09/introduction-to-dataflow-part-1.html) oder [RX.Net] (http: // reactivex. io/intro.html) – JSteward
Sie können dies ohne Datenfluss oder rx.net tun. Veröffentlichen Sie den Code für die GetMirrors-Methode. – Sievajet