2017-05-31 8 views
3

Ich habe ein C# -Projekt mit Hintergrund-Worker erstellt. Es enthält eine Schaltfläche "Start" zum Starten des Hintergrundarbeiters. Das ist mein Code.Hintergrundarbeiter läuft ständig Problem C#

using System.Threading.Tasks; 
using System.Windows; 

namespace Test 
{ 

    public partial class MainWindow : Window 
    { 

     int status = 0; 

     private void btnstart_Click(object sender, RoutedEventArgs e) 
     { 

      worker.DoWork += worker_DoWork; 
      worker.RunWorkerCompleted += worker_RunWorkerCompleted; 
      worker.RunWorkerAsync(); 
      Console.WriteLine("Background worker started successfully"); 
      btnsave.IsEnabled = false; 
     } 

     private void worker_DoWork(object sender, DoWorkEventArgs e) 
     { 

       if (worker.CancellationPending) 
       { 
        e.Cancel = true; 
        return; 
       } 
       Console.WriteLine("Status : " + status); 
       if (status == 0) 
       { 
        status = 1; 
       } 
     } 

     private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
     { 
      Console.WriteLine("worker completed"); 
      btnsave.IsEnabled = true; 
     } 
    } 
} 

Aber jedes Mal, habe ich auf Startknopf klicken, ich erhielt eine Ausgabe wie diese

attempt 1. 

Status : 0 
The thread 0x23dc has exited with code 0 (0x0). 
Status : 1 


attempt 2. 

Status : 0 
The thread 0x148 has exited with code 0 (0x0). 
Status : 1 
Status : 1 

attempt 3. 

Status : 0 
The thread 0x128 has exited with code 0 (0x0). 
Status : 1 
Status : 1 
Status : 1 

Ich beginne den Hintergrund Arbeiter erst nach den bestehenden Arbeitnehmer abgeschlossen sind. Warum wird dann das Protokoll "Status" so gedruckt?

+2

Sie die Event-Handler mehrfach registrieren, ohne _unregistering_. Daher wird der do-Event-Handler mehrmals aufgerufen. – kennyzx

Antwort

7

Das Problem ergibt sich aus der Event-Handler-Zuordnung:

worker.RunWorkerCompleted += worker_RunWorkerCompleted; 

Diese jedes Mal wenn Sie auf die Schaltfläche klicken erfolgt. Da es ein + ist, weisen Sie es mehrmals zu.

Fügen Sie einfach den Event-Handler in dem Fenster Initialisierung:

using System.Threading.Tasks; 
using System.Windows; 

namespace Test 
{ 

    public partial class MainWindow : Window 
    { 

     int status = 0; 

     // should be called when the window is loaded 
     private void ApplicationStart() 
     { 
      worker.DoWork += worker_DoWork; 
      worker.RunWorkerCompleted += worker_RunWorkerCompleted; 
     } 

     private void btnstart_Click(object sender, RoutedEventArgs e) 
     {    
      worker.RunWorkerAsync(); 
      Console.WriteLine("Background worker started successfully"); 
      btnsave.IsEnabled = false; 
     } 

     private void worker_DoWork(object sender, DoWorkEventArgs e) 
     { 

       if (worker.CancellationPending) 
       { 
        e.Cancel = true; 
        return; 
       } 
       Console.WriteLine("Status : " + status); 
       if (status == 0) 
       { 
        status = 1; 
       } 
     } 

     private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
     { 
      Console.WriteLine("worker completed"); 
      btnsave.IsEnabled = true; 
     } 
    } 
} 
+0

danke Romano Zumbe, es funktioniert gut –

Verwandte Themen