2016-11-02 3 views
0

Ich habe ein Projekt, an dem ich gerade arbeite. Es ist ein C# WinForms-Projekt. Im Grunde genommen soll die Verwendung eine Datei.dat laden und diese Datei zum Exportieren in ein anderes Format, das einige Dateien erzeugt, verarbeiten. Das Problem beginnt, wenn ich eine Fortschrittsleiste aktualisieren muss, während die Exportfunktion ausgeführt wird, da der Methodenexport in einer anderen Klasse von einer anderen Assembly ist, da ich mein Projekt in 3 getrennt habe, habe ich eine DLL, die eine gängige Methode für eine Konsole ist App und Grafik-App, so kann ich den Methodenexport von der DLL nicht ändern, da die Konsolen-App von dieser Implementierung abhängt.Fortschrittsbalken während Exportdateien aktualisieren

Ich habe ein Formular, das eine Datei öffnen und klicken Sie auf Export-Schaltfläche, wenn ich auf Export klicken, erstellen Sie ein neues Formular und die Fortschrittsanzeige beginnt aktualisiert zu werden, während die Exportmethode funktioniert. In der Exportmethode kann ich keine weiteren Parameter hinzufügen, da die andere Klasse von der ursprünglichen Implementierung abhängt.

So muss ich wissen, wie Sie eine Fortschrittsanzeige aktualisieren, während Prozessdateien in Methode, jede Eingabedatei mehr als 1 Dateien generieren.

Meine Exportfunktion ist:

Dies ist in einer Klasse von einer Baugruppe:

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

    } 

Wie Sie sehen, jetzt habe ich das und auf diese Weise das Programm funktioniert.

Und das ist eine andere Klasse (Form) von anderen Montage:

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

Aus meiner Form I eine Background schaffen, dass aktualisiert den Fortschritt, wenn ich eine Datei exportieren. Aber ich brauche einen anderen Weg, um damit umzugehen, weil meine Exportmethode falsch ist. Ich muss keinen Worker als Parameter senden, da die ursprüngliche Methode nicht vorhanden ist und die andere Klasse von der ursprünglichen Implementierung abhängt.

Abschließend, wie kann ich eine Fortschrittsanzeige aktualisieren, während Dateien aus anderen Klassen in anderen Assembly exportieren, ohne meine Exportmethode zu ändern?

Antwort

0

Sie sollten keinen Hintergrundarbeiter über Parameter an Ihre Exportmethode senden. Meiner Meinung nach können Sie ein einfaches Ereignis verwenden.

Sie müssen Ihre Exporter-Klasse um ein neues Ereignis erweitern. Da dieses Ereignis neu ist, sollte Ihre Abhängigkeit kein Problem sein.

So sehen Ihre Exporteur-Klasse etw. ähnlich wie folgt aus:

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

Ihre DoWork dies wie folgt umsetzen:

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 
} 

Weiterhin gibt kein Problem sein sollte, wenn Sie einen neuen Parameter zu Ihrer Methode hinzufügen, wenn Sie eine Überlastung verwenden. Ihre Vorgehensweise würde also immer noch funktionieren. Aber die Verwendung des Ereignisansatzes ist viel sauberer.

+0

Aber ich kann das tun, ohne die Methode Export to public zu ändern? Die anderen Klassen rufen diese Methode statisch auf. – Tibo

+0

Ihre Exportmethode war zuvor öffentlich. In deinem Code ist es immer noch öffentlich. Statisch und öffentlich hat keine Verbindung. – Sebi

Verwandte Themen