执行函数时,C#progressbar IsIndeterminate

时间:2015-08-11 12:52:03

标签: c# wpf task

在我正在执行某项功能时,我想要一个不确定的进度条。问题是,当函数正在工作时,UI冻结到最后,所以我最终得到:

void Button1_Click(object sender, RoutedEventArgs e)
{
    progressBar1.IsIndeterminate = true;
    Task.Factory.StartNew(() =>
    {
            scrape();
    });
}

关于背景工作者,我的刮擦功能不会触发。我只是把刮(); onclick它工作得很好。这种情况就像是:

void scrape()
{
    string url = "www.site.com";
    var web = new HtmlWeb();
    var doc = web.Load(url);

    foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//p[@class='bio']")) 
    {   
        //scrape things
    }

    progressBar1.IsIndeterminate = false;
}

进度条进入不确定状态,但scrape()不会触发,并且条形图仍然处于不确定状态。 有什么帮助吗?

3 个答案:

答案 0 :(得分:0)

你应该让你的scrape方法异步,然后在button1_click中等待它,并在button1_click方法中保持progressBar1.IsIndeterminate = false;调用,因为你不允许从另一个线程更改它。

答案 1 :(得分:0)

您可能在后台线程上运行的代码中遇到异常。

通过注册来捕获您的异常 AppDomain.UnhandledException

或更具体地说UnobservedTaskException,它类似于UnhandledException,但特定于从Tasks抛出的异常。

或使您的方法异步并等待try catch子句中的操作:

async void Button1_Click(object sender, RoutedEventArgs e)
{
    progressBar1.IsIndeterminate = true;
    try
    {
        await Task.Factory.StartNew(() =>
        {
           scrape();
        });
    }
    catch(AggregateException ae)
    {}
    finally
    {
         progressBar1.IsIndeterminate = false;
    }
}

答案 2 :(得分:0)

您正在调用从另一个线程分配属性。 WPF做的事情是阻止像这样的跨线程访问,以保持UI线程(主线程)中的所有UI逻辑。如果需要,可以使用Dispatcher从UI线程调用方法。您可以使用myControl.Dispatcher.Invoke(MyMethod)从任何控件访问调度程序。

还可以检查是否需要从调度员调用方法。使用if (myControl.Dispatcher.CheckAccess())。如果此值为true,则表示您处于UI线程中,并且您不需要从调度程序调用。