2016-11-02 41 views
0

我有一个项目,我目前正在努力。它是一个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(); 

    } 

正如你看到的,现在我有和这样的项目工程。

这是从其他组件中的另一个类(表):

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

从我型我创建一个BackgroundWorker的,那个时候我导出一个文件更新进度。但我需要另一种方式来处理,因为我的导出方法是错误的。我不必发送worker作为参数,因为原始方法没有,其他类取决于原始实现。

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

回答

0

你不应该通过参数发送一个背景工作到你的Export方法。在我看来,你可以使用一个简单的事件。

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

所以你的出口商类看起来。 similiar这样的:

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 
} 

而且不应该因为如果添加了一个新的参数,以你的方法,如果你使用过载是一个问题。所以你的方法仍然有效。但使用事件方法更清洁。

+0

但是,我可以做到这一点,而无需改变方法导出到公共?其他类静态地调用这个方法。 – Tibo

+0

您的导出方法在之前已公开。在你的代码中它仍然是公开的。静态和公共没有关系。 – Sebi