2016-01-29 5 views
2

Привет, я spidering сайт и чтение содержимого. Я хочу, чтобы ставка запроса была разумной. До 10 запросов в секунду, вероятно, должно быть нормально. В настоящее время это 5k запросов в минуту, и это вызывает проблемы безопасности, поскольку это выглядит как бот-активность. Как это сделать? Вот мой кодМожно ли ограничить количество веб-запросов в секунду?

protected void Iterareitems(List<Item> items) 
{ 
    foreach (var item in items) 
    { 
     GetImagesfromItem(item); 

     if (item.HasChildren) 
     { 
      Iterareitems(item.Children.ToList()); 
     } 
    } 
} 

protected void GetImagesfromItem(Item childitems) 
{ 
    var document = new HtmlWeb().Load(completeurl); 
    var urls = document.DocumentNode.Descendants("img") 
       .Select(e => e.GetAttributeValue("src", null)) 
       .Where(s => !string.IsNullOrEmpty(s)).ToList(); 
} 
+0

Вы имеете в виду что-то вроде этого? http://stackoverflow.com/questions/7728569/how-to-limit-method-usage-per-amount-of-time – user2900970

+5

'он вызывает проблемы с безопасностью, поскольку это выглядит как бот-деятельность' ... он не делает 't * выглядит бот-активностью *, он ** является бот-активностью :-) – Jcl

ответ

3

Вам нужно System.Threading.Semaphore, с помощью которого можно управлять максимум одновременных потоков/задач. Вот пример:

var maxThreads = 3; 
var semaphore = new Semaphore(maxThreads, maxThreads); 

for (int i = 0; i < 10; i++) //10 tasks in total 
{ 
    var j = i; 
    Task.Factory.StartNew(() => 
    { 
     semaphore.WaitOne(); 
     Console.WriteLine("start " + j.ToString()); 
     Thread.Sleep(1000); 
     Console.WriteLine("end " + j.ToString()); 
     semaphore.Release(); 
    }); 
} 

Вы можете увидеть в большинстве 3 задачи работает, другие ожидают от semaphore.WaitOne(), потому что максимальный предел достигнута, и ожидающий поток будет продолжаться, если другой поток выпустил семафор на semaphore.Release().

Смежные вопросы