当前位置: 首页 > 知识库问答 >
问题:

正确使用进度条

白驰
2023-03-14

这是我第一次在C#中使用进度条。我的代码正在复制一些文件,我想通过进度条显示进度。

我不喜欢我的代码的一点是,我必须遍历所有文件来设置最大值...后来我再次经历同样的过程来复制文件。

我只是想不出一个方法来确保在酒吧里流利的进步而不这样做。我首先必须知道最大值对吗?或者有什么诀窍吗?

代码如下所示:

>

  • 设置最大值:

    private static void setProgressBar(List<Source> sources, List<Destination> destinations)
    {
        progress.Value = 0;
        progress.Maximum = 0;
    
        foreach (var source in sources)
        {
            progress.Maximum += System.IO.Directory.GetDirectories(source.directory, "*",
                SearchOption.AllDirectories).Count() * destinations.Count +
                System.IO.Directory.GetFiles(source.directory, "*.*", SearchOption.AllDirectories).Count() *
                destinations.Count;
        }
    

    复制文件:

    public static void CopyData(List<Source> sources, List<Destination> destinations, RichTextBox box, ProgressBar bar)
    {
        log = box;
        progress = bar;
        setProgressBar(sources, destinations);
    
        foreach (var source in sources)
        {
            foreach (var dirPath in System.IO.Directory.GetDirectories(source.directory, "*",
                SearchOption.AllDirectories))
            {
                foreach (var destination in destinations)
                {
                    logger(dirPath);
                    System.IO.Directory.CreateDirectory(dirPath.Replace(source.directory, destination.directory));
                }
            }
    
            foreach (var newPath in System.IO.Directory.GetFiles(source.directory, "*.*", SearchOption.AllDirectories))
            {
                foreach (var destination in destinations)
                {
                    logger(newPath);
                    File.Copy(newPath, newPath.Replace(source.directory, destination.directory), true);
                }
            }
        }
    }
    

    增加进度条:

    私有静态无效记录器(字符串输出){log.Text=“Copy:”输出System.Environment.NewLine;log.SelectionStart=log.Text.Length;log.ScrollToCaret();progress.Increment(1);}

    所以我运行相同的代码两次...

  • 共有1个答案

    钱和安
    2023-03-14

    我在这里看到两个错误:您从未在CopyData方法中设置进度条的值,第二个错误是:您的CopyData方法将导致您的用户界面冻结,直到方法完成(当时进度条将从0跳到100%)。

    您可以将CopyData方法放在BackgroundWorker中,调用ReportProgress,并在ReportProgress事件中设置条形图的新值。

    下面是一个如何完成的例子。调用工作人员,而不是静态无效Main(...),从那里开始您的CopyData方法

    static void Main(string[] args)
    {
        System.ComponentModel.BackgroundWorker worker = new System.ComponentModel.BackgroundWorker();
        worker.ProgressChanged += Worker_ProgressChanged;
        worker.DoWork += Worker_DoWork;
    
        //Do work
        worker.RunWorkerAsync();
    }
    
    private static void Worker_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
    {
        //Get Values
        var source = null;
        var destinations = null;
    
        //CopyData Method
        setProgressBar(sources, destinations);
        foreach (var source in sources)
        {
            foreach (var dirPath in System.IO.Directory.GetDirectories(source.directory, "*", SearchOption.AllDirectories))
            {
                foreach (var destination in destinations)
                {
                    logger(dirPath);
                    System.IO.Directory.CreateDirectory(dirPath.Replace(source.directory, destination.directory));
                    //Increase Value by 1
                    (sender as System.ComponentModel.BackgroundWorker).ReportProgress(1);
                }
            }
    
            foreach (var newPath in System.IO.Directory.GetFiles(source.directory, "*.*", SearchOption.AllDirectories))
            {
                foreach (var destination in destinations)
                {
                    logger(newPath);
                    File.Copy(newPath, newPath.Replace(source.directory, destination.directory), true);
                    //Increase Value by 1
                    (sender as System.ComponentModel.BackgroundWorker).ReportProgress(1);
                }
            }
        }
    }
    
    private static void Worker_ProgressChanged(object sender, System.ComponentModel.ProgressChangedEventArgs e)
    {
        if (e.ProgressPercentage == 1)
        {
            //If Value gets higher than Maximum it will cause an Exception
            if (progress.Value < progress.Maximum)
                progress.Value += 1;
        }
    }
    
    private static void setProgressBar(List sources, List destinations)
    {
        progress.Value = 0;
        progress.Maximum = 0;
        foreach (var source in sources)
        {
            foreach (var dirPath in System.IO.Directory.GetDirectories(source.directory, "*", SearchOption.AllDirectories))
            {
                //Simplified
                progress.Maximum += destinations.Count;
            }
    
            foreach (var newPath in System.IO.Directory.GetFiles(source.directory, "*.*", SearchOption.AllDirectories))
            {
                //Simplified
                progress.Maximum += destinations.Count;
            }
        }
    }
    
     类似资料:
    • 我正在创建一个JavaFX桌面应用程序,我在上面模拟一些工作负载。我希望应用程序有一个动态更新的进度指示器(随着时间的推移),以显示加载过程是如何进行的。这是我的应用程序类: 这是我的预加载程序类: 另外,我需要说的是,我已经检查了这两个问题(预加载程序中的progressbar不更新和javafx预加载程序不更新进度),但没有找到解决问题的方法。 非常感谢您抽出时间。

    • 问题内容: 我使用Vim已有一段时间了,在PHP文件中无法正常使用HTML缩进。 例如,我想要的是让每个孩子都比其父缩进一个标签,如下所示。 使用PHP-correct- Indent 脚本,代码的格式如下: 即使使用缩进的HTML,然后再向其中添加PHP代码,缩进也会被忽略,从而移动HTML代码的新行而根本没有任何缩进。 那么,有什么方法可以使用Vim获得想要在PHP文件中使用HTML的缩进格式

    • 问题内容: 我试图了解Java 8中API 的方法。 我有简单的逻辑: 但这会导致编译错误: 我当然可以做这样的事情: 但这就像混乱的支票一样。 如果我将代码更改为此: 代码变得越来越脏,这让我想到了回到旧支票。 有任何想法吗? 问题答案: 需要作为参数。您正在向其传递类型为void的表达式。因此,它不会编译。 使用者应被实现为lambda表达式: 甚至更简单,使用方法参考: 这基本上与 想法是仅

    • 问题内容: 我正在尝试了解的语义,以及实体管理器对未保存的瞬态实例的确切含义。我要实现的只是向会话添加一个新的临时实例,并在刷新会话时让Hibernate执行一个。 我发现如果持久保存一个新实例,然后在同一会话中对其进行修改,则实体管理器将同时生成和语句,这可能会导致约束冲突。 例如,假设我有一个带有列 栏 和以下服务方法的实体关系 Foo 。 __ 尽管我们为提供了一个值,但是执行此代码将违反数

    • 问题内容: 什么时候应该从而不是从中导出例外? 不必在方法的子句中声明A ,因为它不一定要专门列出,否则可能是 好 方法,也可能是 不好的, 因为显式声明方法的异常是一种好习惯。 有什么想法吗? 问题答案: 来自未经检查的异常- 争议 : 如果可以合理预期客户端会从异常中恢复,请将其设置为已检查的异常。如果客户端无法采取任何措施来从异常中恢复,请将其设置为未经检查的异常。 请注意,未检查的异常是从

    • 问题内容: 我在AngularJS应用程序中为i18n 使用angular-translate。 对于每个应用程序视图,都有一个专用的控制器。在下面的控制器中,我设置了要显示为页面标题的值。 码 的HTML 的JavaScript 我正在使用angular-translate-loader-url扩展名加载翻译文件。 问题 在初始页面加载时,将显示翻译键,而不是该键的翻译。翻译是,但我看到了。 第