我有一个网站抓取工具,可以使用分页结果来抓取网站。
对于每个页面,我尝试运行一个任务以使其更快,但冻结。
var pageCount = getPageCount(txtSearchQuery.Text);
var tasks = new Task[pageCount];
var link = txtSearchQuery.Text;
for (var i = 1; i <= pageCount; i++)
{
tasks[i-1] = new Task(new Action(() => { Scrape(link, i); }));
tasks[i-1].Start();
}
Task.WaitAll(tasks);
MessageBox.Show("Complete");
我做错了什么?
答案 0 :(得分:7)
我假设您使用的是支持async / await的最新版本的.net
更改方法签名以使其异步并使用Task.WhenAll等待任务结果。这将释放UI线程,即。不会挂起用户界面。
var updateResponse = client.Update<Document, DocumentPartial>(1, descriptor => descriptor
.Doc(new DocumentPartial
{
Title = "new title"
}));
答案 1 :(得分:3)
WaitAll将阻止主线程。而是在完成所有任务后使用ContinueWhenAll并在那里完成工作。
var link = txtSearchQuery.Text;
for (var i = 1; i <= pageCount; i++)
{
tasks[i-1] = new Task(new Action(() => { Scrape(link, i); }));
tasks[i-1].Start();
}
Task.Factory.ContinueWhenAll(tasks, completedTasks =>
{
// Do continuation work.
});