То, что я в конечном счете пытаюсь выполнить, - это получить 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));
}
/// ???
Я не вижу никакого параллелизма в вашем описание. «Как только задача GetPage (i) завершается, если задача была в состоянии получить страницу, добавьте ее в коллекцию страниц и попытайтесь получить следующую самую большую страницу, которая еще не пыталась обработать» - это подразумевает последовательное лечение страниц. Вы можете делать весь этот процесс асинхронно. – agfc