我有很少的代码,例如:
using (WebClient wc = new WebClient())
{
wc.Proxy = new WebProxy("IP", Port);
resume:
if (!wc.IsBusy)
{
string rtn_msg = string.Empty;
try
{
rtn_msg = wc.DownloadString(new Uri("http://google.com/"));
}
catch (WebException) { }
catch (Exception) { }
}
else
{
System.Threading.Thread.Sleep(1000);
goto resume;
}
}
我正在尝试将它与 ThreadPool 一起使用:
foreach (Proxy proxy in s)
{
ThreadPool.QueueUserWorkItem((c) =>
{
this.CheckProxy(proxy);
});
}
问题在于列表中的最后一个代理由所有线程检查。
例如,对于代理列表中的 ip1、ip2、ip3、ip4,所有线程都会检查列表中的最后一项 ip4。
这是为什么?关于如何让它发挥作用有什么建议吗?
如果您有像 ReSharper 这样的工具,它会警告您Access to modified closure
。您需要制作本地副本:
foreach (Proxy proxy in s)
{
var p = proxy;
ThreadPool.QueueUserWorkItem((c) =>
{
this.CheckProxy(p);
});
}
另外我建议将 goto 更改为 while 循环。 Goto 被认为是不好的做法,就您而言,您不会从中获得任何好处。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)