2016-11-20 1 views
0

Was ich letztlich zu erreichen versuche, ist das HTML von einer unbekannten, aber begrenzten Anzahl von Webseiten zu bekommen, wo GetPage(i) das HTML für Seite i zurückgibt und ich aufhören will, sobald ich eine Nicht-Seite gefunden habe.Wie implementiere ich dieses parallele Muster in C#?

Das genaue Muster, das ich für gehe ist wie folgt:

  • starten N parallele Aufgaben, die GetPage(0), ... sind, GetPage(N-1).
  • Sobald eine Aufgabe GetPage(i) abgeschlossen ist, wenn die Aufgabe die Seite abrufen konnte, fügen Sie sie zu einer Sammlung von Seiten hinzu und versuchen Sie, die nächste größte Seite zu erhalten, die noch nicht versucht wurde, verarbeitet zu werden; oder wenn die Aufgabe die Seite nicht abrufen konnte, alle Aufgaben GetPage(j) wo j>i abbrechen.

Also meine versuchte Implementierung ist wie

 var docs = new LinkedList<HtmlDocument>(); 
     int tlimit = 20; 
     var tasks = new Task<HtmlDocument>[tlimit]; 
     for(int i = 0; i < tlimit; ++i) 
     { 
      tasks[i] = Task<HtmlDocument>.Factory.StartNew(() => BoardScanner.GetBoardPage(i)); 
     } 
     /// ??? 
+0

Ich sehe keine Parallelität in Ihrer Beschreibung. "Sobald eine Aufgabe GetPage (i) abgeschlossen ist, wenn die Aufgabe die Seite abrufen konnte, fügen Sie sie zu einer Sammlung von Seiten hinzu und versuchen Sie, die nächste größte Seite zu erhalten, die noch nicht verarbeitet wurde" sequentielle Behandlung von Seiten. Sie können den gesamten Prozess jedoch asynchron durchführen. – agfc

Antwort

0

Dies könnte das sein, was Sie suchen. Es behandelt Ihre Dokumente parallel und async möglicherweise beginnend mit der größten (nicht garantiert). Wenn Sie wirklich nach dem Größten gehen wollen, dann müssen Sie das ein wenig optimieren. Und ich bin nicht sicher, ob Sie mit der parallelen Bearbeitung für parallele Sortierung von Mitteln am Ende wird die Ihnen mehr Kontrolle an der Maschine in Bezug auf die Entscheidung geben, was zuerst behandelt wird:

var docs = new List<XmlDocument>(); 

      var tasks = docs.OrderBy(p => p.InnerXml.Length).Select(file => Task.Run(async() => 
      { 
       await BoardScanner.GetBoardPage(file); 
       // your document treatment logic here 
      } 
       )); 

      await Task.WhenAll(tasks); 
      // your logic upon all of your documents were treated;