c#循环多线程
我对线程编程相当陌生。我实际上正在开发某种元搜索引擎,我需要一个每秒解析网页的应用程序 在我的应用程序中,我有一个解析ie所需网页的函数:go_parse(“http://www.google.com/page/1)) 我想做的是,当函数完成对第1页的解析后,它会解析第2页,等等。但是我有点不明白该怎么做 我必须做一个循环,至少启动go_parse函数50次(第1页到第50页) 希望有人能帮我 提前谢谢 编辑: 通过任务功能,我可以让它工作: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
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(堆栈),在我个人看来,这更符合逻辑。如果您使用堆栈或