【发布时间】:2012-01-15 00:06:38
【问题描述】:
我有一个网站列表和一个代理服务器列表。
我有这个动作
Action<string> action = (string url) =>
{
var proxy = ProxyHandler.GetProxy();
HtmlDocument html = null;
while (html == null)
{
try
{
html = htmlDocumentLoader.LoadDocument(url, proxy.Address);
// Various db manipulation code
ProxyHandler.ReleaseProxy(proxy);
}
catch (Exception exc)
{
Console.WriteLine("{0} proxies remain", ProxyHandler.ListSize());
// Various db manipulation code
proxy = ProxyHandler.GetProxy();
}
}
};
我用这个称呼
urlList.AsParallel().WithDegreeOfParallelism(12).ForAll(action);
或
Parallel.ForEach(urlList, action);
我的ProxyHandler类如下
public static class ProxyHandler
{
static List<Proxy> ProxyList = new ProxyRepository().GetAliveProxies().ToList();
public static Proxy GetProxy()
{
lock (ProxyList)
{
while (ProxyList.Count == 0)
{
Console.WriteLine("Sleeping");
Thread.Sleep(1000);
}
var proxy = ProxyList[0];
ProxyList.RemoveAt(0);
return proxy;
}
}
public static void ReleaseProxy(Proxy proxy)
{
lock (ProxyList)
{
if(!ProxyList.Contains(proxy))ProxyList.Add(proxy);
}
}
public static int ListSize()
{
lock (ProxyList)
{
return ProxyList.Count;
}
}
}
我的问题是,当它执行时,它似乎真的很快完成了大约 90% 的网站,然后需要很长时间才能完成剩下的。
我的意思是,在 100 个网址中,前 90 个网址与后 10 个网址所花费的时间一样多。
我已经排除了代理已经死亡,因为没有抛出异常。似乎 urlList 上的最后一项需要很长时间才能完成。
更新:
我正在添加一些运行数据以使我的问题更清楚:
Minute 1 2 3 4 5 6 7 8 9 16 18 19
Count 23 32 32 17 6 1 1 1 1 2 1 2
正如您在前 4 分钟中看到的那样,我完成了 104/119 个请求。然后剩下的需要 15 分钟。
这看起来像是线程连接中的一个问题,但我没有发现这可能是什么。
【问题讨论】:
-
您是否尝试过分析应用程序? Visual Studio 有一个并发分析器,可以为您提供一些线索。
标签: c# multithreading c#-4.0 task-parallel-library