Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#循环多线程_C#_Multithreading_For Loop - Fatal编程技术网

c#循环多线程

c#循环多线程,c#,multithreading,for-loop,C#,Multithreading,For Loop,我对线程编程相当陌生。我实际上正在开发某种元搜索引擎,我需要一个每秒解析网页的应用程序 在我的应用程序中,我有一个解析ie所需网页的函数:go_parse(“http://www.google.com/page/1)) 我想做的是,当函数完成对第1页的解析后,它会解析第2页,等等。但是我有点不明白该怎么做 我必须做一个循环,至少启动go_parse函数50次(第1页到第50页) 希望有人能帮我 提前谢谢 编辑: 通过任务功能,我可以让它工作: public void ProcessNextPag

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

在我的应用程序中,我有一个解析ie所需网页的函数:go_parse(“http://www.google.com/page/1))

我想做的是,当函数完成对第1页的解析后,它会解析第2页,等等。但是我有点不明白该怎么做

我必须做一个循环,至少启动go_parse函数50次(第1页到第50页)

希望有人能帮我

提前谢谢

编辑:

通过任务功能,我可以让它工作:

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));
    }
谢谢大家

如果您使用的是C#4.0,您可以使用它的方法和
列表
队列
,或
堆栈

在这里我使用,比如说
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)
}
这只是一个基本的想法,您自然应该以更适合您的需要的方式对其进行更改和构建。

如果您使用的是C#4.0,您可以使用它的方法和
列表
队列
,或
堆栈

在这里我使用,比如说
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)
}

这只是一个基本的想法,当然,你应该改变它,并以更适合你需要的方式来构建它。

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

如果que中没有项目,处理器将再次等待,否则将获取que中的下一个项目

这样,创建要处理的新项目的应用程序将保持独立运行,并且不会干扰处理

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

private CustomQueClass queClass = new CustomQueClass();

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

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

如果que中没有项目,处理器将再次等待,否则将获取que中的下一个项目

这样,创建要处理的新项目的应用程序将保持独立运行,并且不会干扰处理

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

private CustomQueClass queClass = new CustomQueClass();

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

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

您拥有的是生产者-消费者关系。
BlockingCollection
类非常适合这些情况。默认情况下,它将使用您想要的
ConcurrentQueue
。只需创建队列,创建尽可能多的工作线程即可ant,每个人都可以使用
GetConsumingEnumerable
获取项目,直到它们完成为止,并且一个或多个生产者将项目添加到队列中。

与多线程有什么关系?页面是否并行解析?您可能想查看生产者-消费者队列模式。您使用的是.Net的哪个版本?如果.Net 4.0查看任务,我希望将来能有类似5页的并行解析(取决于资源),但目前1:1是一个很好的开始。正如你所说,队列系统就是我要寻找的。是的,如果你需要串行(1乘1)解析,我会使用.net 4,您只需要一个简单的
for
循环。for循环冻结我的应用程序。我真的需要一些东西,等待它完成后再进入第二个循环。与多线程有什么关系?页面是否并行解析?您可能想查看生产者-消费者队列模式。您使用的是.Net的哪个版本?如果.Net 4.0查看任务,并在将来继续。我希望有类似5页的并行解析(取决于资源),但目前1后1将是一个良好的开始。正如您所说,队列系统是我正在寻找的。是的,如果您需要串行(1乘1)解析,我将使用.net 4,你所需要的只是一个简单的
for
循环。for循环冻结了我的应用程序。我真的需要一些东西,直到它完成后才能进入第二个循环。在这种情况下,为什么你更喜欢
Stack
而不是
Queue
?嗯,因为只是感觉(推)和获得(弹出)在我看来,在这种情况下更简单的解决方案是,对索引进行操作。这只是一个选择问题。队列不对索引进行操作,它有类似于pop和push(队列和tryDequeue)的方法,只是它是FIFO而不是LIFO(堆栈),这在我个人看来更符合逻辑。如果您使用
堆栈
队列
,那么您需要锁定对它们的访问,因为它们不是为多个并发线程设计的。更好的方法是使用
并发队列
阻塞集合
@Tigran,因为它看起来更容易问题是如何在不阻塞UI的情况下执行长时间运行的任务。在这种情况下,为什么您更喜欢
Stack
而不是
Queue
?嗯,因为只是感觉(推)和获取(弹出)在我看来,在这种情况下更简单的解决方案是,然后对索引进行操作。这只是一个选择问题。队列不对索引进行操作,它有类似于pop和push(队列和tryDequeue)的方法,只是它是FIFO而不是LIFO(堆栈),在我个人看来,这更符合逻辑。如果您使用
堆栈