在我正在执行某项功能时,我想要一个不确定的进度条。问题是,当函数正在工作时,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()不会触发,并且条形图仍然处于不确定状态。 有什么帮助吗?
答案 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线程中,并且您不需要从调度程序调用。