c#多线程for循环

时间:2013-01-02 14:34:00

标签: c# multithreading for-loop

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

在我的应用程序中,我有一个功能可以分析想要的网页: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));
    }

全部谢谢

3 个答案:

答案 0 :(得分:4)

如果您使用的是C#4.0,则可以使用Task,其ContinueWith方法以及List<T>Queue<T>Stack<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)
}

这只是一个基本概念,当然,您应该以更好地满足您需求的方式进行更改和架构。

答案 1 :(得分:0)

我做了类似的事情已经有一段时间了。基本上简言之,我创建了一个带有que的类,其中包含要处理的项目列表。比我开始一个带有处理类的新线程,该处理类遍历que并通过循环逐个处理它们。

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

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

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

private CustomQueClass queClass = new CustomQueClass();

Thread backgroundThread = new Thread(
  new ThreadStart(() =>
  {
      CustomProcessClass processClass = new CustomProcessClass(queClass);
  }
));
backgroundThread.Start();

答案 2 :(得分:0)

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