如何增加进度条? [关闭]

Posted

技术标签:

【中文标题】如何增加进度条? [关闭]【英文标题】:How to increase a progress bar? [closed] 【发布时间】:2021-03-15 14:50:45 【问题描述】:

这个问题似乎是一个常规问题,但事实并非如此。

无论我在做什么,进度条都不会增加。

在基本概念中,我有一个 GUI 表单,它有一个免费的工作人员。在后台工作人员中,我使用自定义类从测量文件中读取数据。我想在一个文件完成后增加进度条,但不管我做什么,它什么都不做。

我已阅读文档,但没有。 https://docs.microsoft.com/en-us/dotnet/desktop/winforms/controls/how-to-set-the-value-displayed-by-the-windows-forms-progressbar-control?view=netframeworkdesktop-4.8

我试过了:

worker.ReportProgress方法

Controls.Invoke((MethodInvoker)delegate); 方法

Furhtermore 也尝试了 Control.Update()Control.Refress(),但这些都不起作用。

请帮忙!

提前谢谢大家!

【问题讨论】:

progressBar1.Value += 1; 直接引用自您链接的文章。你试过了吗? 一般来说,我认识的大多数人都会建议不要在新开发中使用 Backgroundworker 来支持 Task-async / IProgress。但是如果没有看到任何代码,就很难判断该范围的重构是否合理。你真的需要添加一些代码......如果它甚至是相关的,那就太好了。 您将问题标记为“asp.net”,但您可能要求的是“winforms”,或者? 您是否处理了进度更改事件?自从我使用后台工作人员以来已经有很长时间了,但是从内存中,后台工作人员上有一个事件需要处理以处理进度更改。当您执行 worker.ReportProgress 时,它会触发该事件。你必须处理它,否则它什么都不做。在其中,您将根据上述评论更新进度条。 (我假设 Winforms 而不是 asp.net)。 【参考方案1】:

进度条不会更新的原因是 UI 无法从后台线程更新。 Backgroundworker 在后台线程上运行,使 UI 保持响应。

三种解决方案:

    在 backgroundworker 中,启动一个在 Main UI 线程上运行的新任务,并在那里更新进度条。这是一种糟糕的编码,但在其他用例中 .InvokeRequired 是有效的。 使用后台工作者 ReportProgress。在 ProgressChanged 处理程序(在 UI 线程上运行)中,照常更新进度条。 重写您的应用程序以使用“await Function1()/async Task Fuction1() 模式而不是 Backgroundworker。这里可能会使用 .InvokeRequired。您还可以使用 EventHandlers 将响应返回给调用者。

示例跟随

#1 警告错误的编码风格!

private void bgw1_DoWork(Object sender, DoWorkEventArgs e)

    ...
    await Task.Run( () =>
    
        progressBar1.InvokeIfRequired( o =>
        
            progressBar1.Value += 1;
         );
    );
    ...



public static class MyExtensions

    public static void InvokeIfRequired<T>(this T obj, InvokeIfRequiredDelegate<T> action) where T : ISynchronizeInvoke
    
        if (obj.InvokeRequired)
        
            obj.Invoke(action, new Object[]  obj );
        
        else
        
            action(obj);
        
    

#2 这种方式效果很好:

private void bgw1_DoWork(Object sender, DoWorkEventArgs e)

    ...
    worker.ReportProgress(0, 50);   //50% progress out of 100
    ...


private void bgw1_ProgressChanged(Object sender, ProgressChangedEventArgs e)

    if(e.UserState is Int32 i)
    
        progressBar1.Value = i;
    

#3

Is a complete re-write and likely outside the scope of your question.

如果对您有帮助,记得将其标记为答案。

【讨论】:

以上是关于如何增加进度条? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

增加高度时如何平滑进度条的拐角?

如何更新进度条使其平滑增加?

iOS WKWebView 加载进度条导航栏返回&关闭 (Swift 4)

C# WinForm自定义进度条

如何在Android中制作这个进度条? [关闭]

如何仅显示 wget 进度条? [关闭]