2016-11-02 66 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