列表上的多线程无法按预期工作

时间:2017-08-30 12:00:18

标签: c# .net multithreading

我有一个大约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个完成了检查。

2 个答案:

答案 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
    }
}