Hallo zusammen,
ich habe nen Prozess in nen BackgroundWorker gepackt.
Soweit auch alles schick.
Jetzt will ich das e.Cancelled Property im RunWorkerCompleted Event abfragen und egal ob ich den Prozess abbreche oder er durchläuft e.Cancelled ist immer false!
ist das ein Bug?
hab Framework 2.0
Danke!
Poste gerne Code, wenn jemand was dazu sehen will. nur sagen was.
MFG Veasel
Hi
hast du WorkerSupportsCancellation auf true gesetzt? Ansonsten sind mehr Infos von Nöten 😉
hallo,
ja hab ich!
ich poste sonst mal die ganze klasse:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
backgroundWorker1.WorkerReportsProgress = true; // -> default = false!!
backgroundWorker1.WorkerSupportsCancellation = true; // -> defalut = false!!
backgroundWorker1.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork);
backgroundWorker1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted);
backgroundWorker1.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged);
}
void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
//eine Änderung bei dem Prozess
this.progressBar1.Value = e.ProgressPercentage;
label1.Text = e.UserState.ToString();
}
void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
//Worker fertig
if (!e.Cancelled) //->hier ist immer false!!
MessageBox.Show("Fertig!");
else
MessageBox.Show("Abbruch!");
}
void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
//Aufgabe anstoßen
BgTask aLongTask = new BgTask(this.backgroundWorker1);
aLongTask.DoWork();
}
private void button1_Click(object sender, EventArgs e)
{
backgroundWorker1.RunWorkerAsync();
}
private void button2_Click(object sender, EventArgs e)
{
this.backgroundWorker1.CancelAsync();
//setzt die CancellationPending Property auf true
//muss dann abgefragt werden
}
}
und das was im Hintergrund gemacht wird:
class BgTask
{
private BackgroundWorker _bgWorker;
public BgTask(BackgroundWorker bgWorker)
{
this._bgWorker = bgWorker;
}
public void DoWork()
{
for (int i = 0; i < 100; i++)
{
if (!this._bgWorker.CancellationPending) // abfragen, ob abgebrochen wurde
{
Thread.Sleep(100);
this._bgWorker.ReportProgress(i, i + "x mal gepennt!");
}
else
{
//ggf. aufräumen und Dinge rückgängig machen!
this._bgWorker.ReportProgress(100, "Abgebrochen!");
}
}
}
}
MFG Veasel
Hallo veasel,
naja, du musst ihn schon auch abbrechen:
this._bgWorker.ReportProgress(100, "Abgebrochen!");
return; // <== sonst läuft ja die Schleife lustig weiter
herbivore
Hallo herbivore,
das kann es nicht sein, bringt kein Unterschied auch wenn du recht hast.
das ist natürlich auch ein fehler meinerseits!!
e.Cancelled ist aber trotzdem immer false, ob ich abbreche oder durchlaufen lasse.
MFG Veasel
Hallo veasel,
in backgroundWorker1_DoWork musst du e.Cancel auf true setzen, wenn BgTask.DoWork abgebrochen wurde.
herbivore
okay wir kommen der sache langsam näher 😮)
das e.cancel muss ich dann aber in abhängigkeit vom e.Result setzen, oder?
aber was steht da drin?
weil wenn ich das einfach auf true setze, ist es auch true wenn ich nicht abbreche...
hmm...
MFG Veasel
Hallo veasel,
das ist doch nun wirklich normales Programmiergeschäft. Gib BgTask.DoWork einen bool als Rückgabetyp, der angibt, ob die Methode abgebrochen wurde.
herbivore
herbivore,
bitte entschuldige...ich sitze hier schon seit 9 und mach nichts anderes...
aber du bist wie immer der beste!! 👍 👍
DANKE!!
[Solved]
nur falls einer sich auch nochmal so anstellt wie ich 😉
if (!aLongTask.DoWork())
{
e.Cancel = true;
}
Bye
MFG Veasel
Hallo veasel,
dann doch besser:
e.Cancel = !aLongTask.DoWork();
oder wenn du den Rückgabewert von Success auf Cancel umstellst, noch besser
e.Cancel = aLongTask.DoWork();
herbivore
nochmal herzlichen dank!!!
ihr seit doch die besten und die schnellsten!!!
einen schönen Tag!!
MFG Veasel