导出文件

时间:2016-11-02 08:38:22

标签: c# winforms progress-bar backgroundworker

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

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

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

我的导出功能是:

这是一个集合中的一个类:

     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();
        }
    }

从我的表单中创建一个后台工作程序,在导出一个文件时更新进度。但我需要另一种方法来处理,因为我的导出方法是错误的。我不必将worker作为参数发送,因为原始方法没有,而其他类依赖于原始实现。

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

1 个答案:

答案 0 :(得分:0)

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

您需要使用一个新事件扩展您的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
}

如果使用重载,如果向方法添加新参数,则应该没有问题。所以你的方法仍然可行。但使用事件方法要清晰得多。