【问题标题】:Can I show a progress indicator when the file loading code is not in a BackgroundWorker?当文件加载代码不在 BackgroundWorker 中时,我可以显示进度指示器吗?
【发布时间】:2014-05-06 22:45:52
【问题描述】:

我见过的所有示例都显示了 BackgroundWorker 中的“长循环”。虽然我知道这是正确的方法,但我的问题是代码最初不是这样编写的,将它放入 BackgroundWorker 会很复杂。有什么方法可以在状态栏或无模式弹出窗口中创建进度条,而无需更改文件加载代码?谢谢。

【问题讨论】:

  • 代码目前不在任何线程中吗?无论哪种方式,您都可以“创建进度条”.. 但如果它当前不在线程中,您的文件加载代码无疑会阻塞 UI 线程.. 因此,对进度条的任何更新都将不可见。
  • 在 WPF/Silverlight/Metro 中,您可以使用数据绑定。如果文件正在后台线程上加载,并且您有一个包含已加载文件百分比的公共属性,那么您可以将此属性绑定到进度条的值,并且将在更新属性时更新.一个更简单的解决方案,但可能不是那么好:您还可以在文件加载时将进度条设置为不确定状态(它显示它正在加载文件,但不显示已完成/剩余多少)。
  • 不,如果不在与 UI 线程不同的线程上运行加载代码,您将无法执行此操作。 BackgroundWorker 本身不是必需的,但需要不同的线程。

标签: c# wpf progress indicator


【解决方案1】:

您真正可以做到这一点的唯一方法是,如果您的长时间运行的代码可以分成多个部分,在这种情况下,您可以执行以下操作:

//long running code
DoSomethingStage1();

progressBar.Value = 30;
Application.DoEvents(); // update the GUI

DoSomethingStage2();

progressBar.Value = 60;
Application.DoEvents(); // update the GUI

DoSomethingStage3();

progressBar.Value = 100;
Application.DoEvents(); // update the GUI

http://msdn.microsoft.com/en-us/library/system.windows.forms.application.doevents(v=vs.110).aspx

不过,这有点小技巧 - 如果可以的话,最好硬着头皮将代码移到单独的线程中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-19
    • 1970-01-01
    • 2017-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-19
    • 1970-01-01
    相关资源
    最近更新 更多