2016-11-20 5 views
0

То, что я в конечном счете пытаюсь выполнить, - это получить HTML-код с неизвестного, но ограниченного числа веб-страниц, где GetPage(i) возвращает HTML-адрес для страницы i, и я хочу остановить, как только найду нестраницу.Как реализовать этот параллельный шаблон в C#?

Точный образец, который я иду, как это:

  • Start N параллельные задачи, которые GetPage(0), ..., GetPage(N-1).
  • Как только задача GetPage(i) завершает работу, если задача была способна получить страницу, добавьте ее в коллекцию страниц и попытайтесь получить следующую самую большую страницу, которая еще не пыталась обработать; или если задача не смогла получить страницу, отмените все задачи GetPage(j) где j>i.

Так что моя попытка реализации, как

 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

Я не вижу никакого параллелизма в вашем описание. «Как только задача GetPage (i) завершается, если задача была в состоянии получить страницу, добавьте ее в коллекцию страниц и попытайтесь получить следующую самую большую страницу, которая еще не пыталась обработать» - это подразумевает последовательное лечение страниц. Вы можете делать весь этот процесс асинхронно. – agfc

ответ

0

Это может быть то, что вы ищете. Он будет обрабатывать ваши документы параллельно и асинхронно, возможно, начиная с самого большого (не гарантируется). Если вы действительно хотите пойти по самому большому, вам придется немного подкорректировать это. И я не уверен, что если вы будете в конечном итоге с параллельной обработкой для параллельного вида означает, что вы даете больше контроля на машину с точки зрения решения, что получает лечение первым:

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; 
Смежные вопросы