0

我对线程编程很陌生。我实际上正在开发某种元搜索引擎,我需要一个每秒解析网页的应用程序。

在我的应用程序中,我有一个函数可以解析想要的网页,即:go_parse("http://www.google.com/page/1);

我想要做的是当函数完成解析第 1 页时,它会解析第 2 页等。但我对如何执行此操作有点困惑。

我必须创建一个循环来启动 go_parse 函数至少 50 次(第 1 页到第 50 页)。

希望有人可以帮助我。

提前致谢。

编辑:

使用 TASK 功能,我可以让它工作:

public void ProcessNextPage(int page)
    {
        Task t = Task.Factory.StartNew(() =>
        {
            go_parse("http://www.google.com" + searchForm.Text + "/"+page+"/");
        });
        t.ContinueWith(task =>
        {
            if (label2.Text != "Stopped")
            {
                page++;
                SetTextBoxText(page.ToString(), textBoxPage, false);
                ProcessNextPage(page);
            }
        });
    }

    private void button5_Click(object sender, EventArgs e)
    {
        label2.Text = "Started";
        ProcessNextPage(int.Parse(textBoxPage.Text));
    }

谢谢大家

4

3 回答 3

4

如果您使用的是 C# 4.0,则可以使用Task、它的ContinueWith方法和List<T>or Queue<T>, orStack<T>的页面来处理。

我在这里使用,说Stack<T>

所以我们有stack所有页面要处理的地方

public void ProcessNextPage() {

   if(stack.Count == 0) //INFINIT LOOP BREAK CONDITION
        return;

   var pageToProcess = stack.Pop();
   Task.StartNew(t=> {
       /*DO SOMETHING WITH pageToProcess*/
   }).ContinueWith(a=>processNextPage()); //ON COMPLETE, CALL MYSELF (RECURSION)
}

这只是一个基本想法,您自然应该以更适合您需求的方式对其进行更改和构建。

于 2013-01-02T14:39:53.287 回答
0

我已经有一段时间没有做这样的事情了。简而言之,我创建了一个带有 que 的类,其中包含要处理的项目列表。然后我用一个处理类启动了一个新线程,该线程通过队列并通过循环一个一个地处理这些。

如果队列中没有项目,则处理器再次等待,否则从队列中获取下一个项目。

以这种方式,创建要处理的新项目的应用程序保持单独运行,并且不会干扰处理。

从我的记忆中有点像这样:

private CustomQueClass queClass = new CustomQueClass();

Thread backgroundThread = new Thread(
  new ThreadStart(() =>
  {
      CustomProcessClass processClass = new CustomProcessClass(queClass);
  }
));
backgroundThread.Start();
于 2013-01-02T14:45:42.897 回答
0

你所拥有的是一种生产者-消费者关系。该BlockingCollection课程非常适合这些情况。默认情况下,它将使用 a ConcurrentQueue,这是您想要的。只需创建队列,创建任意数量的工作线程,每个工作线程都可以GetConsumingEnumerable用来获取项目直到完成,然后一个或多个生产者将项目添加到队列中。

于 2013-01-02T15:28:46.043 回答