【问题标题】:Getting an "Empty Queue" exception in C#在 C# 中获取“空队列”异常
【发布时间】: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);
        });
}

Error in question

【问题讨论】:

  • 请粘贴完整的错误信息。这可能是相关的stackoverflow.com/questions/36210799/queue-empty-exception
  • 在调用 Dequeue 之前尝试检查队列中是否有内容。
  • Enumerable.Range(0, max).Select((_ =&gt; "http://google.com")).ToArray(); 使用Enumerable.Repeat更加简单。
  • await Task.Run(async () =&gt; 我怀疑不需要这行代码。

标签: c# exception queue


【解决方案1】:

你的问题是你反复排空你的队列。

你开始创建两个队列:

var proxies = getdatafromfile(PATH + "\\proxy\\proxy.txt");
var useragents = getdatafromfile(PATH + "\\proxy\\user-agents.txt");

你像这样创建IEnumerable&lt;ClearanceHandler&gt; handlers

var handlers = Enumerable.Range(0, max).Select(_ => new ClearanceHandler(proxies.Dequeue()) { UserAgent = useragents.Dequeue(), MaxTimeout = 6000 });

你将它传递给DoDownload,它会调用它:

var client = new HttpClient(gethandlerindexed(indext, handlers));

那个术语在gethandlerindexed中调用handlers.ElementAt(nb % handlers.Count())

现在,因为handlersIEnumerable&lt;ClearanceHandler&gt;,所以您每次都重新运行可枚举。所以它每次运行时都会调用proxies.Dequeue()useragents.Dequeue()

以下是适合您的方法:

var handlers =
    Enumerable
        .Range(0, max)
        .Select(_ => new ClearanceHandler(proxies.Dequeue()) { UserAgent = useragents.Dequeue(), MaxTimeout = 6000 })
        .ToArray();

注意.ToArray()。这会强制执行可枚举的单次执行。只要两个队列具有相同数量的元素,它就可以正常工作。

【讨论】:

  • 它似乎工作正常!非常感谢;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-12
  • 2012-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多