WaitAll阻止UI

时间:2016-03-24 15:34:14

标签: c# wpf

我有一个网站抓取工具,可以使用分页结果来抓取网站。

对于每个页面,我尝试运行一个任务以使其更快,但冻结。

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");

我做错了什么?

2 个答案:

答案 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.
});