2009-06-23 3 views
0

Ich habe eine Listbox, in der ich mindestens 2 Dateien zum Zusammenführen geben muss. die Verschmelzung erfolgt, wenn i button.The Fortschrittsbalken beginnen auf Zusammenführen klicken und das Meldungsfeld wird angezeigt, dass die Dateien haben merged.i Hintergrund Arbeiter sind mit dem Fortschrittsbalken laufen.BackgroundWorker gibt ein Problem in C# beim Hinzufügen eines Elements in Listbox?

Jetzt ist das Problem, wenn die Zusammenführung mit 2 Dateien erfolgt ist, ich füge eine weitere Datei hinzu, klicken Sie auf die Merge-Schaltfläche Merge ist fertig Nachricht erscheint, klicken Sie auf OK auf das Meldungsfeld, wieder erscheint das Meldungsfeld mit der gleichen Nachricht, die zusammenführen wurde durchgeführt. Dieses Meldungsfeld wird weiterhin angezeigt, wie oft ich die Datei in die Listbox einfüge.

Zum Beispiel für 2-Dateien erscheint Meldung 1ce den über das Hinzufügen von 1 weitere Datei Nachricht 2ice erscheint, 1 weitere Datei in listbox Meldung erscheint 3ic.Like dis es weiter ....

Wenn ich den Debugger verwendet verfolgt sie, ich bemerkte, dass mein Hintergrund Worker Runcompleted Fall, dass Anzahl, wie oft aufgerufen wird, wenn i-Datei im listbox.Here hinzuzufügen, ist der Code für Merge Schaltfläche Click-Ereignis ...

Worker.DoWork += new DoWorkEventHandler(Worker_DoWork); 
Worker.RunWorkerCompleted += 
    new RunWorkerCompletedEventHandler(Worker_RunWorkerCompleted); 
Worker.WorkerSupportsCancellation = true; 

if (!Worker.IsBusy) 
    Worker.RunWorkerAsync(); 
else 
    MessageBox.Show("Cannot run background worker twice "); 

if (Worker.IsBusy) 
{ 
    progress = new ProgressDialogDTB(); 
    progress.FormClosing += 
     new FormClosingEventHandler(ProgressDialog_FormClosing); 
    progress.ShowDialog(this); 
} 
while (Worker.IsBusy) 
{ 
    Application.DoEvents(); 
} 

//For Background Worker completed Event... 
private void Worker_RunWorkerCompleted(object sender, 
    AsyncCompletedEventArgs e) 
{    
    if (progress != null) 
    { 
     progress.Close(); 
     progress = null; 
    } 
    if (e.Cancelled) 
     MessageBox.Show(" Progress was cancelled ");        

    if (e.Error == null) 
     if (!e.Cancelled) 
      MessageBox.Show("Files has been merged "); 

    if (e.Error != null) 
     MessageBox.Show(e.Error.Message);  
}//Worker_RunWorkerCompleted 

ich weiß nicht, wo Ich verhalte mich falsch. Bitte helfen Sie ... Danke ...

+0

Können Sie den Code Arbeiter teilen? Was bedeutet Fertigstellung? Wenn es x mal aufgerufen wird, liegt es nahe, dass Ihr Worker es x-mal vollständig anzeigt, entweder weil es so funktioniert oder es x-mal instanziiert wird. – Lazarus

+0

Viel Code, aber nichts davon ist relevant für das Problem. – Will

+0

Keine Ahnung zu deinem Problem. Aber ich würde überdenken: while (Worker.IsBusy) {Application.DoEvents();} ebenfalls. Es ist CPU-Zeit essen! (oder war es nur zum Testen?) –

Antwort

3

Ich vermute, dass Sie bei jedem Merge Button klicken Sie einen neuen Delegierten registrieren. Wenn der folgende Code:

Worker.DoWork += new System.ComponentModel.DoWorkEventHandler(Worker_DoWork); 
Worker.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(Worker_RunWorkerCompleted); 

in dem Click-Ereignishandler der Merge-Schaltfläche ist es für Sie in Ihrem Formular initailization Methode zu bewegen. Sie müssen einen Delegierten nur einmal registrieren. Das nächste Mal, wenn Sie es tun, fügt ein neues hinzu, so dass beim zweiten Zusammenführen klicken Sie zweimal, bei drittem Klick dreimal und so weiter.

+0

Danke..es hat funktioniert .... eine weitere Sache meine Fortschrittsanzeige läuft noch, wenn das Meldungsfeld erscheint "Dateien wurden zusammengeführt". Wie verschwindet der Fortschrittsbalken, bevor das Meldungsfeld erscheint? –

+0

Hast du es funktioniert? Ich nehme an, das Problem war, dass in der Worker-Ereignisbehandlungsroutine der Code unterhalb der Bedingung if (progress! = Null), der für das Schließen des Dialogs verantwortlich ist, nicht ausgeführt wird (Bedingung wird zu false ausgewertet)? –

2

Wenn Ihr Arbeitnehmer ein Modul-Ebene variabel ist und Sie zu seiner Invokation Liste anhängen jedes Mal auf die Schaltfläche klickt, dann wird diese Methode jedes Mal aufgerufen werden. Sagen Sie 3-mal klicken, dann ist dieser Code Worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(Worker_RunWorkerCompleted); wird 3-mal ausgeführt werden und wird 3-mal aufgerufen. Legen Sie den Completed-Handler einmal fest, wenn Sie das Worker-Objekt instanziieren.

Bah! Angeschlagen!

Verwandte Themen