C # что такое эффективный способ кодирования рекурсивных функций - PullRequest
1 голос
/ 10 февраля 2012

Я строю систему с большими объемами транзакций, в основе которой лежит рекурсивная функция.

Короче говоря, я хочу создать паука, который развернется и извлечет URL-адреса, найденные в ссылках на странице, изатем возьмите каждый из этих URL и продолжайте что-то делать.за короткое число циклов нагрузка может экспоненциально возрастать, поэтому я хочу приложить большие усилия, чтобы сделать этот код максимально упрощенным и эффективным.

мне следует использовать многопоточность?если да, то как (как выглядит логика)

Я использую последние asp.net c # и VS2010 с .net4 и надеюсь, что у новой технологии есть какой-то простой способ сделать это и скрыть всю сложностьпод капотом, обрабатывая логику эффективно и очень быстро.

Ответы [ 2 ]

2 голосов
/ 10 февраля 2012

Вы не должны использовать рекурсию для паука.У вас должна быть задача, которая анализирует страницу и делает все, что вы хотите сделать с этой страницей.Если он находит ссылки, он должен добавить его в очередь ссылок (убедитесь, что вы не обработали ссылку более одного раза, иначе у вас будет бесконечный цикл).Основной процессор будет просто проходить через очередь и обрабатывать ссылки.

1 голос
/ 10 февраля 2012

.NET параллельная библиотека задач предлагает хорошее решение для вашей проблемы. См. эту статью MSDN Magazine для получения дополнительной информации.

TPL разработан для выполнения параллельного выполнения, но обрабатывает многопоточность за вас. Это также упрощает ожидание выполнения задач и выполнение одной задачи по завершении другого набора задач и т. Д.

В вашем случае это будет означать, что «родитель» будет запускать задачу для каждой ссылки в документе, а затем может ждать завершения дочерних задач, если это необходимо. Дочерние задачи могут запускать дочерние задачи и т. Д. Рекурсивно. Не беспокоясь о потоке.

...