【发布时间】:2021-09-13 19:57:48
【问题描述】:
我正在尝试使用代理同时运行多个请求。我想要一个代理一次发起一个请求,这就是为什么我有一个gethandlerindexed 函数
另外,错误发生在最后一次调用gethandlerindexed 时,这里最大值 = 2,所以我有 2 个代理,2 个用户代理,但它不起作用。有问题的错误是:空队列
我不明白这个错误是从哪里来的。
int indext = 0;
private async Task DoDownload(IEnumerable<ClearanceHandler> handlers, SemaphoreSlim sem, string url)
{
await Task.Delay(100);
try
{
await sem.WaitAsync();
indext++;
var client = new HttpClient(gethandlerindexed(indext, handlers)); // error in question appear here
string link_image = null;
using (HttpResponseMessage response = await client.GetAsync(url))
{
using (HttpContent content = response.Content)
{
link_image = await content.ReadAsStringAsync();
richTextBox1.TextInvoke(link_image);
}
}
}
finally
{
sem.Release();
}
}
private void Form1_Load(object sender, EventArgs e)
{
ServicePointManager.DefaultConnectionLimit = 20;
}
ClearanceHandler gethandlerindexed(int nb, IEnumerable<ClearanceHandler> handlers)
{
return (handlers.ElementAt(nb % handlers.Count()));
}
Queue<string> getdatafromfile(string path)
{
Queue<string> q = new Queue<string>();
var proxies = File.ReadAllLines(path);
for (int i = 0; i < 2; i++)
q.Enqueue(proxies[i]);
return (q);
}
private async void button1_Click(object sender, EventArgs e)
{
var proxies = getdatafromfile(PATH + "\\proxy\\proxy.txt");
var useragents = getdatafromfile(PATH + "\\proxy\\user-agents.txt");
// MessageBox.Show(proxies.Count() + " / " + useragents.Count());
var max = proxies.Count();
var handlers = Enumerable.Range(0, max).Select(_ => new ClearanceHandler(proxies.Dequeue()) { UserAgent = useragents.Dequeue(), MaxTimeout = 6000 });
var semaphore = new SemaphoreSlim(max, max);
await Task.Run(async () =>
{
var downloads = Enumerable.Range(0, max).Select((_ => "http://google.com")).ToArray();
var tasks = downloads.Select(dl => DoDownload(handlers, semaphore, dl));
await Task.WhenAll(tasks);
});
}
【问题讨论】:
-
请粘贴完整的错误信息。这可能是相关的stackoverflow.com/questions/36210799/queue-empty-exception
-
在调用 Dequeue 之前尝试检查队列中是否有内容。
-
Enumerable.Range(0, max).Select((_ => "http://google.com")).ToArray();使用Enumerable.Repeat会更加简单。 -
await Task.Run(async () =>我怀疑不需要这行代码。