【问题标题】:Should I thread this?我应该穿这个吗?
【发布时间】:2010-03-22 22:37:54
【问题描述】:

我有一个“加载进度”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();
}

如果需要更多代码,请告诉我。

【问题讨论】:

    标签: c# wpf multithreading


    【解决方案1】:

    考虑使用 ProgressBar 的 Dispatcher.Invoke 从外部线程通过委托异步访问进度条。

    This 的帖子可能会有所帮助。

    【讨论】:

      【解决方案2】:

      我建议您使用另一个线程来进行处理。进度条在最后被填满,所以你没有在它的编程上犯错误。
      一般来说,您应该避免在用户界面线程中进行处理。

      【讨论】:

        【解决方案3】:

        那么,有多少提要和多少项?我会等你数一数,以便设置进度条的总长度。

        ...

        那是什么?在完成大部分工作之前,您不会知道总数吗?好吧,听起来进度条不是正确的控件。

        你在这里做(至少应该做的)异步工作。绝对在工作线程中进行。绝对让用户知道工作正在后台进行。但不要使用进度条。您无法确切知道您处于流程的哪个阶段,以及在所有长期流程完成之前您还需要多长时间。您的大多数用户会认为您的进度条是谎言,并会嘲笑您的烂。

        只需在您的 RSS 提要框上使用标准的“工作在后台进行”fady-circle-thingy(装饰器会很好地工作)并完成它。

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-04-27
            • 1970-01-01
            • 2010-12-03
            • 1970-01-01
            • 2011-12-22
            • 2023-04-08
            • 2011-07-17
            • 1970-01-01
            相关资源
            最近更新 更多