我正試圖用一個代理同時運行多個請求。我希望代理一次發起一個請求,這就是為什么我有一個gethandlerindexed函式
另外,錯誤發生在最后一次呼叫gethandlerindexed時,這里max=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)); //問題中的錯誤出現在這里。
string link_image = null;
using (HttpResponseMessage response = await client.GetAsync(url))
{
使用 (HttpContent content = response.Content)
{
link_image = await content.ReadAsStringAsync()。
richTextBox1.TextInvoke(link_image)。
}
}
}
最終
{
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, e)。
{
var proxies = getdatafromfile(PATH "proxyproxy.txt") 。
var useragents = getdatafromfile(PATH "proxyuser-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)。
});
uj5u.com熱心網友回復:
你的問題是,你正在反復耗盡你的佇列。
你開始創建了兩個佇列:
你開始創建了兩個佇列。
var proxies = getdatafromfile(PATH "proxyproxy.txt") 。
var useragents = getdatafromfile(PATH "proxyuser-agents.txt") 。
你創建IEnumerable<ClearanceHandler>處理程式像這樣:
var handlers = Enumerable.Range(0, max) 。 Select(_ => new ClearanceHandler(proxies.Dequeue()) { UserAgent = useragents.Dequeue(), MaxTimeout = 6000 }) 。
你把這個傳給DoDownload,它就會呼叫這個:
var client = new HttpClient(gethandlerindexed(indext, handlers) )。
這在術語中呼叫handlers.ElementAt(nb % handlers.Count())在gethandlerindexed中。
現在,因為handlers是一個IEnumerable<ClearanceHandler>你每次都在重新運行enumerable。所以它每次運行時都會不斷呼叫 proxies.Dequeue() 和 useragents.Dequeue()。
以下是對你有用的方法:
var handlers =
列舉
.Range(0, max)
.Select(_ => new ClearanceHandler(proxies.Dequeue() ) { UserAgent = useragents.Dequeue(), MaxTimeout = 6000 })
.ToArray()。
注意.ToArray()。這將強制對列舉程式進行一次執行。只要兩個佇列有相同數量的元素,它就能正常作業。
uj5u.com熱心網友回復:
在進行 Dequeue 之前,你需要檢查佇列是否為空。
if (queue.Count != 0)
https://docs.microsoft.com/en-us/dotnet/api/system.collections.queue.dequeue?view=net-5.0
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/320002.html
標籤:
