我有一个大约1000个项目的列表,我需要通过Facebook搜索。我把它做成多线程,这样我就可以加快搜索过程。不幸的是,似乎有些线程只是采用组合项而不是处理它。
问题是,当他们获得新组合时,我会将其从我的List<string>
中删除,以便在不需要的情况下多次搜索。< / p>
我不喜欢使用大量的线程,我使用的是3。
class BrowserHandler
{
public static readonly ILogger Logger = LogManager.GetCurrentClassLogger();
public BrowserHandler()
{
StartBrowser();
StartBrowser();
}
private void StartBrowser()
{
var combination = Program.GetServer().GetNextCombination();
Logger.Debug(combination);
runBrowserThread(new Uri("https://www.facebook.com/search/top/?q=" + combination));
}
private void runBrowserThread(Uri url)
{
var th = new Thread(() => {
var br = new WebBrowser();
br.DocumentCompleted += browser_DocumentCompleted;
br.Navigate(url);
Application.Run();
});
th.SetApartmentState(ApartmentState.STA);
th.Start();
}
void browser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
var br = sender as WebBrowser;
if (br.Url == e.Url)
{
if (br.DocumentText.Contains("_52eh _5bcu"))
{
var links = br.Document.GetElementsByTagName("div");
foreach (HtmlElement link in links)
{
if (link.GetAttribute("className") == "_52eh _5bcu")
{
Logger.Warn("Found owner for [" + e.Url.ToString().Split('=')[1] + "] " + link.InnerText);
}
}
}
else
{
Logger.Warn("Finished checking [" + e.Url.ToString().Split('=')[1] + "] and found no owner.");
}
Application.ExitThread();
StartBrowser();
}
}
}
输出:
12:56:24 - 07999999991
12:56:24 - 07999999891
12:56:24 - 07999999791
12:56:27 - Found owner for [07999999991] Kaydie-anne Hairdressa Reid
12:56:27 - Found owner for [07999999891] Yuli Berk
12:56:28 - 07999999691
12:56:28 - 07999999591
12:56:29 - Finished checking [07999999791] and found no owner.
12:56:29 - Finished checking [07999999691] and found no owner.
12:56:29 - 07999999491
12:56:29 - 07999999391
12:56:29 - Finished checking [07999999591] and found no owner.
12:56:30 - 07999999291
12:56:30 - Finished checking [07999999491] and found no owner.
12:56:31 - 07999999191
12:56:31 - Finished checking [07999999391] and found no owner.
12:56:31 - 07999999091
12:56:32 - Finished checking [07999999291] and found no owner.
12:56:32 - Finished checking [07999999191] and found no owner.
12:56:32 - 07999998991
12:56:32 - 07999998891
12:56:33 - Finished checking [07999999091] and found no owner.
12:56:33 - 07999998791
12:56:34 - Found owner for [07999998991] Suzanne McMaster
12:56:34 - 07999998691
12:56:35 - Finished checking [07999998891] and found no owner.
12:56:35 - 07999998591
12:56:35 - Finished checking [07999998791] and found no owner.
12:56:36 - 07999998491
正如你所看到的,从列表中取得了16个,只有13个完成了检查。
答案 0 :(得分:2)
可能会有一些结果在你的foreach迭代中没有通过测试,通过像这样的布尔标志以某种方式管理它们。
class BrowserHandler
{
public static readonly ILogger Logger = LogManager.GetCurrentClassLogger();
public BrowserHandler()
{
StartBrowser();
StartBrowser();
}
private void StartBrowser()
{
var combination = Program.GetServer().GetNextCombination();
Logger.Debug(combination);
runBrowserThread(new Uri("https://www.facebook.com/search/top/?q=" + combination));
}
private void runBrowserThread(Uri url)
{
var th = new Thread(() => {
var br = new WebBrowser();
br.DocumentCompleted += browser_DocumentCompleted;
br.Navigate(url);
Application.Run();
});
th.SetApartmentState(ApartmentState.STA);
th.Start();
}
void browser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
var br = sender as WebBrowser;
if (br.Url == e.Url)
{
if (br.DocumentText.Contains("_52eh _5bcu"))
{
var links = br.Document.GetElementsByTagName("div");
bool AnyFound=false;
foreach (HtmlElement link in links)
{
if (link.GetAttribute("className") == "_52eh _5bcu")
{
Logger.Warn("Found owner for [" + e.Url.ToString().Split('=')[1] + "] " + link.InnerText);
AnyFound= true;
}
}
if(!AnyFound) {
Logger.Warn("Finished checking [" + e.Url.ToString().Split('=')[1] + "] and found no owner.");
}
}
else
{
Logger.Warn("Finished checking [" + e.Url.ToString().Split('=')[1] + "] and found no owner.");
}
Application.ExitThread();
StartBrowser();
}
}
}
答案 1 :(得分:0)
你应该尝试在你的foreach中添加else
,可能会有你遗失的3个项目:
foreach (HtmlElement link in links)
{
if (link.GetAttribute("className") == "_52eh _5bcu")
{
Logger.Warn("Found owner for [" + e.Url.ToString().Split('=')[1] + "] " + link.InnerText);
}
else
{
// some code here
}
}