gpt4 book ai didi

c# - 请求方法和线程问题?

转载 作者:行者123 更新时间:2023-11-30 12:49:31 25 4
gpt4 key购买 nike

我正在开发一款应用程序,用于为 Google+1、Facebook 分享和推文抓取网站。我有一个请求方法,它接受一个 URL,然后关闭并获取每种社交媒体类型的计数。

逻辑如下:-

  • 获取网址
  • 通过本地/默认 IP 发出请求,直到我们得到限速/非 500 响应
  • 出错时
    • 调用 SelectNewProxy() 遍历代理列表并随机返回一个进行尝试(避免 IP 请求限制的好方法)
    • 从列表中删除错误的代理以避免再次选择它
    • 启动一个每秒递增的计时器
  • 当定时器 == 600(10 分钟)
    • 创建新的 WebProxy 并再次尝试我们本地/默认 IP 后面的请求
    • 重置计时器

冲洗并重复

代码如下:

public string Request(string action)
{
HttpWebRequest req;

OnStatusChange(new MyArgs() { Message = "Status: Requesting..." });
string response = string.Empty;

while (response.Equals(string.Empty) && proxy != null)
{
try
{
req = (HttpWebRequest)WebRequest.Create(action);
req.Proxy = proxy;
HandleUIMessages(action, proxy);
response = new StreamReader(req.GetResponse().GetResponseStream()).ReadToEnd();
}
catch
{
//OnProxyChange(new MyArgs() { ProxyMessage = string.Format("Proxy: {0}", proxy.Address.ToString()) });
RemoveProxy(proxy);

if (!timer.Enabled)
{
timer.Interval = (int)TimeInterval.OneSecond;
timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
timer.Enabled = true;
timer.Start();
}
WebProxy reset = new SelectNewProxy();
proxy = counter >= 600 ? reset : proxy = SelectNewProxy();
}
}
return response;
}

值得一提的是,我正在使用 ThreadPool 并且每个请求都在它自己的线程中运行。看起来它会起作用,但我没有得到预期的效果,计数器达到“600”并设置 proxy = reset 但它似乎只做了非常短暂的,可能只针对第一个线程那击中了吗?然后调用 timer_Elapsed 并重置 counter。可能是一个线程正在命中它,分配 proxy = reset 然后因为 counter 现在已被重置(不再 >= 600),所有后续排队的线程调用选择新代理()?感觉我在胡说八道,但希望有人能理解我想说的话,如果我猜对了,我如何确保所有线程都得到 proxy = reset 并重试我们的初始 IP?

非常感谢任何帮助!

谢谢

最佳答案

你是如何声明proxy的?如果你在多个线程上读/写它的值,你应该确保你用 volatile 关键字声明它,否则在一个线程上写入 proxy 可能不会被观察到其他。

例如:

volatile WebProxy proxy;

关于c# - 请求方法和线程问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11450512/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com