【问题标题】:Update progressbar while export files导出文件时更新进度条
【发布时间】:2016-11-02 08:38:22
【问题描述】:

我目前正在从事一个项目。它是一个 C# WinForms 项目。基本上,使用应该加载一个 file.dat 并处理该文件以生成一些文件的其他格式导出。当我需要在导出功能运行时更新进度条时,问题就开始了,因为方法导出在其他程序集中的其他类中,因为我将我的项目分为 3,我有一个 dll,它是控制台的常用方法应用程序和图形应用程序,因此我无法更改从 dll 导出的方法,因为控制台应用程序依赖于该实现。

我有一个允许打开文件并单击导出按钮的表单,当我单击导出时,创建一个新表单并且在导出方法起作用时进度条开始更新。在导出方法中,我不能添加更多参数,因为其他类依赖于初始实现。

所以我需要知道如何在方法中处理文件时更新进度条,每个输入文件生成超过 1 个文件。

我的导出函数是:

这是来自一个程序集的一类:

     public static void Export(File file, string output, string inputFile,BackgroundWorker worker)
    {
        //Other operations
        //......
        // 
        for (int m = 0; m < variable.Count; m++)
        {

            ExportoFile(varibel, output);
            worker.ReportProgress(m + 1);
        }
            worker.CancelAsync();

    }

如你所见,现在我有了它,并且程序以这种方式运行。

这是来自其他程序集的另一个类(Form):

private void worker_DoWork(object sender, DoWorkEventArgs e)
       {
        var worker = sender as BackgroundWorker;       
        Exporter.Export(file, output, inputFile, worker);

    }


    void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        // The progress percentage is a property of e

        progressBar.Value = e.ProgressPercentage;
        progressLabel.Text = ((100 * (e.ProgressPercentage))/size ).ToString() +"%";
        if (e.ProgressPercentage == size)
        {
            worker.CancelAsync();
            this.Close();
        }
    }

从我的表单中,我创建了一个后台工作人员,当我导出一个文件时它会更新进度。但是我需要另一种方法来处理它,因为我的导出方法是错误的。我不必发送工人作为参数,因为原始方法没有,其他类取决于原始实现。

总之,如何在不修改我的导出方法的情况下从其他程序集中的其他类导出文件时更新进度条?

【问题讨论】:

    标签: c# winforms progress-bar backgroundworker


    【解决方案1】:

    您不应通过参数将后台工作程序发送到您的导出方法。在我看来,您可以使用一个简单的事件。

    您需要使用一个新事件来扩展您的 Exporter 类。因为这个事件是新的,所以你的依赖应该不是问题。

    所以你的 Exporter 类看起来是这样的。类似这样:

    public class ProgressEventArgs : EventArgs
    {
        public int Percentage {get;set}
    }
    
    public class Exporter
    {
         public static event EventHandler<ProgressEventArgs> ReportProgress
    
         public void Export(File file, string output, string inputFile)
         {
            for (int m = 0; m < variable.Count; m++)
            {      
              ExportoFile(varibel, output);
              ReportProgress(this, new ProgressEventArgs {Percentage = m + 1};
            }        
          }
    }
    

    你的 DoWork 会这样实现:

    private void worker_DoWork(object sender, DoWorkEventArgs e)
    {  
       Exporter.ReportProgress += reportProgress; //Make sure you call this once      
       Exporter.Export(file, output, inputFile, worker);   
    }
    
    private void reportProgress(object sender, ProgressEventArgs e)
    {
       //use e.Percentage
    }
    

    此外,如果您使用重载向方法添加新参数,则应该不会有问题。所以你的方法仍然有效。但是使用事件方法更简洁。

    【讨论】:

    • 但是,我可以在不更改导出到公共的方法的情况下做到这一点吗?其他类静态调用此方法。
    • 您的导出方法以前是公开的。在您的代码中,它仍然是公开的。静态和公共没有联系。
    猜你喜欢
    • 1970-01-01
    • 2012-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-17
    • 2016-11-22
    • 1970-01-01
    相关资源
    最近更新 更多