Laden...

BackgroundWorker Cancelled Property

Erstellt von veasel vor 16 Jahren Letzter Beitrag vor 16 Jahren 1.838 Views
V
veasel Themenstarter:in
327 Beiträge seit 2005
vor 16 Jahren
BackgroundWorker Cancelled Property

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

664 Beiträge seit 2005
vor 16 Jahren

Hi

hast du WorkerSupportsCancellation auf true gesetzt? Ansonsten sind mehr Infos von Nöten 😉

V
veasel Themenstarter:in
327 Beiträge seit 2005
vor 16 Jahren

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

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo veasel,

naja, du musst ihn schon auch abbrechen:


this._bgWorker.ReportProgress(100, "Abgebrochen!");
return; // <== sonst läuft ja die Schleife lustig weiter

herbivore

V
veasel Themenstarter:in
327 Beiträge seit 2005
vor 16 Jahren

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

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo veasel,

in backgroundWorker1_DoWork musst du e.Cancel auf true setzen, wenn BgTask.DoWork abgebrochen wurde.

herbivore

V
veasel Themenstarter:in
327 Beiträge seit 2005
vor 16 Jahren

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

49.485 Beiträge seit 2005
vor 16 Jahren

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

V
veasel Themenstarter:in
327 Beiträge seit 2005
vor 16 Jahren

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

49.485 Beiträge seit 2005
vor 16 Jahren

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

V
veasel Themenstarter:in
327 Beiträge seit 2005
vor 16 Jahren

nochmal herzlichen dank!!!

ihr seit doch die besten und die schnellsten!!!

einen schönen Tag!!

MFG Veasel