c# DoWork an externe Klasse weiterleiten - mit Ereignis


Hein_nieh

Grünschnabel
Hallo Fans der Bits und Bytes,

ich bin hier neu im Forum und versuche mich in C# einzuarbeiten.
Hierzu habe ich eine Frage zum Backgroundworker.

Mein Anliegen ich möchte über die Methode DoWork eine weitere Klasse aufrufen in der eine Berechnung durchgeführt wird. Das klappt auch, wenn ich der Klasse das Objekt des Backgroundworkers als Parameter mitgeben.
Das es funktioniert sehe ich daran, dass worker_ProgressChanged und worker_completed richtig funktionieren.

Nun soll die Berechnung aber auch vorzeitig beendet werden, z.B. durch einen Button.
Das Ereignis DoWorkEventArgs kann ich zwar auch an die aufgerufene externe Klasse weiterleiten, jedoch wird während der Berechnung darauf nicht reagiert.
Was mache ich falsch bzw. wo liegt der Denkfehler. Zum besseren Verständnis ein paar Codeschnipsel
C#:
 public partial class wndMain : Window
    {
        public wndMain()
        {
            InitializeComponent();

            //Backgroundworker: Namespace: System.ComponentModel.Backgroundworker
            this.worker = new BackgroundWorker();
            this.worker.WorkerReportsProgress = true;
            this.worker.WorkerSupportsCancellation = true;
            //Ereignisse am Objekt anmelden
            this.worker.DoWork += new DoWorkEventHandler(this.worker_DoWork);
            this.worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(this.worker_completed);
            this.worker.ProgressChanged += new ProgressChangedEventHandler(this.worker_ProgressChanged);
        }//Konstructor

        //Ereignisse
        private void worker_DoWork(object sender, DoWorkEventArgs e)
        {
            //Hier Backgroundprozess starten
            clsCalculation objCalculation;
            objCalculation = new clsCalculation(sender,e);
            // Sender=worker, das funktioniet auch, aber e
        }

C#:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.Windows;
namespace WPF_MeinTest_PrgBar_3
{
    class clsCalculation
    {
        public clsCalculation( object worker, DoWorkEventArgs e )
        {
            this._worker = (BackgroundWorker) worker;
            this._e = e;
            DoCalculation();
        }//Konstruktor
        private void DoCalculation()
        {
            int maxi = 10;
            for (int i = 0; i < maxi; i++)
            {
                // Abbruch
                if (_worker.CancellationPending)
                {
                    //Hier sollte jetzt die Berechnung vorzeitig beendet werden, macht sie aber nicht
                    MessageBox.Show("Cancel ....", "Cancel");
                    _e.Cancel = true;
                    return;
                }
                System.Threading.Thread.Sleep(900);
                int progressPercentage = Convert.ToInt32(i * 100 / maxi);
                this._worker.ReportProgress(progressPercentage);//Progress ereignis auslösen
            }//for
        }//DoCalculation
        private BackgroundWorker _worker;
        private DoWorkEventArgs _e;
       
    }//class
}//NS
In der Klasse clsCalculation hätte ich erwartet, dass bei if (_worker.CancellationPending) die Berechnung angehalten wird. Leider erfolgt in der Schleife keine Reaktion.
Kann jemand helfen.
Vielleicht kann mir jemand die grundsätzliche Lösung aufzeigen, wie ich in der via DoWork aufgerufenen Klasse den vorzeitigen Abbruch schaffe.

Für einen Hinweis wäre ich sehr dankbar.
Gruss Hein_nieH
 
Zuletzt bearbeitet:

Spyke

Premium-User
Die Abbruchbedingung sollte eigentlich so schon funktionieren.
Da scheint es eher irgendwo anders im original Code zu hapern.

Und der MessageBox aufruf im DoCalculation muss raus.
Die Routine läuft ja in einem Hintergrund Thread und die MessageBox braucht den UI Thread.
Eigentlich sollte hier auch eine Thread Exception erscheinen/aufploppen.


Edit:
CancelAsync() für Abbruch wird schon aufgerufen oder?
 

Hein_nieh

Grünschnabel
Hallo Spyke,

danke für die Antwort.
Du hast recht die MessageBox im Hintergrundprozess war die Ursache dass es nicht funktioniert hat.
Da ist mir wohl ein Anfängerfehler unterlaufen.
Jedenfalls funktioniert es jetzt so wie ich es mir vorgestellt habe. :)

Gruss Hein_nieH
 

Neue Beiträge