我是线程编程的新手。我实际上正在开发某种元搜索引擎,我需要一个每秒解析网页的应用程序。
在我的应用程序中,我有一个功能可以分析想要的网页: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));
}
全部谢谢
答案 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
获取项目,直到完成,并且一个或多个生产者将项目添加到队列中。