是否可以限制每秒的Web请求数量?

时间:2016-01-29 09:01:07

标签: c# webrequest

您好我正在抓住网站并阅读内容。我希望保持合理的请求率。每秒最多大约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();
}

1 个答案:

答案 0 :(得分:4)

您需要System.Threading.Semaphore,您可以使用它来控制最大并发线程/任务。这是一个例子:

Runtime runtime = new Runtime();
String testPackage = "com.android.contacts.test";
String testRunner = "com.android.contacts.test.G11NInstrumentationTestRunner";
String command = "am instrument --user 0 -w " + testPackage + "/" + testRunner;
runtime.exec(command);

您最多可以看到3个任务正在运行,其他任务正在等待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(); }); } ,因为达到了最大限制,如果另一个线程通过semaphore.WaitOne()释放了信号量,则挂起的线程将继续。