我应该穿这个吗?

时间:2010-03-21 13:11:38

标签: c# wpf multithreading

我有一个“加载进度”WPF表单,当我开始将一些结果加载到我的主窗口时,我实例化,每次加载结果时,我希望进度条填充x量(基于我正在加载的结果数量。

然而,发生的情况是窗口中的进度条一直保持空白,直到结果加载完毕,然后它才会显示完整的进度条。

这是否需要线程才能正常工作?或者仅仅是因为我试图让它发挥作用?

//code snippet
LoadingProgress lp = new LoadingProgress(feedCount);
lp.Show();
foreach (FeedConfigGroup feed in _Feeds) {
  feed.insertFeeds(lp);
}

//part of insertFeeds(LoadingProgress lbBox)
foreach (Feeds fd in _FeedSource) {
    lpBox.setText(fd.getName);
    XmlDocument feedResults = new XmlDocument();
    feedResults.PreserveWhitespace = false;
    try {
        feedResults.Load(wc.OpenRead(fd.getURL));
    } catch (WebException) {
        lpBox.addError(fd.getName);
    }
    foreach (XmlNode item in feedResults.SelectNodes("/rss/channel/item")) {
      //code for processing the nodes...
    }
    lpBox.progressIncrease();
}

如果需要更多代码,请与我联系。

4 个答案:

答案 0 :(得分:1)

考虑使用ProgressBar Dispatcher.Invoke以异步方式从外部线程访问进度条。

This帖子可能会有帮助。

答案 1 :(得分:1)

我建议你使用另一个线程来进行处理。最后填写了进度条,因此您的编程没有出错 通常,您应该避免在用户界面线程中进行处理。

答案 2 :(得分:0)

那么,有多少Feed和多少项?我会等你计算它们以设置进度条的总长度。

...

那是什么?在大部分工作完成之前,您不会知道总数吗?好吧,听起来像进度条不适合使用。

你正在做(至少应该是什么)异步工作。绝对在工作线程中做到这一点。绝对让用户知道后台正在进行的工作。但是不要使用进度条。你不可能确切地知道你所处的过程中的哪一点,以及你需要多长时间才能完成所有持久的过程。大多数用户都会看到你的进度条就像它的谎言一样,并且会嘲笑你。

只需在您的RSS Feed框中使用标准的“后台正在进行的工作”fadey-circle-thingy(Adorner可以很好地工作)并完成它。

答案 3 :(得分:0)

使用this video我设法让它工作,Dispatch.BeginInvoke(除了需要Dispatcher.Invoke的那个)是要走的路。如果有人想要最终的代码让我知道,我可以发布。