我的網站列表和代理服務器的列表中的任務。並行化使用.AsParallel()或的ForAll性能Parallel.ForEach問題
我有這個動作
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個URL,因爲它確實做着最後的10
我已經排除了代理是死的,因爲沒有拋出異常要花多少時間做的第一件90。看起來好像urlList上的最後一項只需要很長時間才能完成。
UPDATE:
我加入了一些運行數據,使我更清楚的問題:
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分鐘我做的請求一百十九分之一百零四見。然後剩下15分鐘。
這看起來像在線程的加盟問題,但我不能發現什麼,這可能是。
您是否嘗試過分析該應用程序? Visual Studio有一個併發分析器,可以給你一些線索。 –