C# 使用WebClient和接收错误403

C# 使用WebClient和接收错误403,c#,webclient,C#,Webclient,我目前正在使用WebClient打开一些网站,但一段时间后,我开始收到错误403消息。 我认为这是因为我频繁/快速地访问他们的服务器。我假设我所需要做的就是在请求之间添加一个线程。Sleep时间范围 因为我已经做了很多次了,有没有关于如何在不花费大量时间的情况下处理节流问题的建议? 例如,两次请求之间的3秒将花费我3个小时的时间 所以问题是,Thread.Sleep真的是解决这个问题的正确方法吗?如果是的话,什么是一个好的时间框架 作为旁注,我还使用了HttpWebRequest,遇到了同样的问

我目前正在使用
WebClient
打开一些网站,但一段时间后,我开始收到
错误403
消息。
我认为这是因为我频繁/快速地访问他们的服务器。我假设我所需要做的就是在请求之间添加一个
线程。Sleep
时间范围

因为我已经做了很多次了,有没有关于如何在不花费大量时间的情况下处理节流问题的建议?
例如,两次请求之间的3秒将花费我3个小时的时间

所以问题是,
Thread.Sleep
真的是解决这个问题的正确方法吗?如果是的话,什么是一个好的时间框架


作为旁注,我还使用了
HttpWebRequest
,遇到了同样的问题。我仍然在其他代码项目中使用它,从技术上讲,我希望在其他代码项目中使用相同的解决方案(或接近它),使用
HttpWebRequest

尝试并行运行请求

public static void RunRequest(Uri uri, Action<string> onCompleted)  
{
    var client = new WebClient();
    client.DownloadStringCompleted += (sender, e) => onCompleted(e.Result);
    client.DownloadStringAsync(uri);
};

您是否按顺序运行请求?@esskar目前是的。您是否考虑过交错请求,我的意思是:给定每T秒必须打开的k个网站,您总是按相同的顺序打开它们,这取决于每个“打开”操作需要多长时间。这可能会给您一些请求之间的时间。不过,这是否足以避免您报告的错误是一个完全不同的问题。您必须首先通过这些网站中的任何一个进行身份验证吗?@AndreaScarcella那么您的意思是,对于每个网站的项目数,请执行网站1、2、3、4、5、1、2等操作?
private const int _maxParallelRequest = 10;
private int _requestCount = 0;
private readonly object _sync = new object();
private ManualResetEvent _ev = new ManualResetEvent(false);

while(true)
{
    foreach (var uri in _allYourUris)
    {
        var wait = false;
        lock (_sync)
        {
            if (_requestCount >= _maxParallelRequest)
                wait = true;
        }

        if (!wait)
        {
            lock (_sync) { ++_requestCount; }
            RunRequest(uri, r => {
                lock (_sync) 
                { 
                    --_requestCount; 
                    _ev.Set();
                }    
                // handle r
            });
            continue;
        }
        _ev.WaitOne();
    }
    Thread.Sleep(3000);
}