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
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
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: