您好我正在抓住网站并阅读内容。我希望保持合理的请求率。每秒最多大约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 :(得分: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()
释放了信号量,则挂起的线程将继续。