我目前正在使用WebClient
打开几个网站,但一段时间后我开始收到Error 403
条消息。
我假设是因为我经常/快速地击中他们的服务器。我假设我需要做的就是在请求之间添加Thread.Sleep
时间范围。
由于我必须多次这样做,是否有关于如何处理节流问题的建议而不必花费大量时间?
例如,请求之间的3秒最终会让我像3小时一样。
所以问题是,Thread.Sleep
真的是正确的解决方案吗?如果是的话,它的时间框架是什么时候?
作为附注,我还使用了HttpWebRequest
并遇到了同样的问题。我仍然在其他代码项目中使用它,并且在技术上我希望利用HttpWebRequest
答案 0 :(得分:0)
尝试并行运行请求
public static void RunRequest(Uri uri, Action<string> onCompleted)
{
var client = new WebClient();
client.DownloadStringCompleted += (sender, e) => onCompleted(e.Result);
client.DownloadStringAsync(uri);
};
警告:代码不是testet,我从未使用WebClient
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);
}