Entwickler-Ecke

C# - Die Sprache - BackgroundWorker abbrechen


ReBeL1337 - Mi 27.02.08 11:03
Titel: BackgroundWorker abbrechen
Hallo ich habe ein Problem und zwar:

Ein BackgroundWorker in dem Programm an dem ich arbeite fragt immer den aktuellen Strom ab und lässt ihn in einer ProgressBar erscheinen.

Er befindet sich in einer Endlosschleife und läuft so lange bis man den Button "Weiter" oder "Zurück" betätigt. Danach hängt sich das Programm aber auf.

1. Frage:
Ich glaube das sich der BackgroundWorker nicht komplett beendet wenn man auf "Zurück" klickt, deshalb suche ich den Befehl den ich dann dem "Weiter" und "Zurück" Button zuweisen kann. Damit der BackgroundWorker richtig beendet wird.
Es soll auch so laufen das, wenn ich auf den "Zurück" Button klicke und danach auf den "Weiter" ( also einen Schritt zurück und dann wieder einen Schritt vor ) der BackgroundWorker wieder startet, das tut er momentan leider nicht, das Progamm stürzt dann ab. Liegt das daran das der nicht richtig beendet wurde?

2. Frage:
Wenn der BackgroundWorker läuft ist die CPU zu 100% ausgelastet, ich denke das liegt daran das er so schnell wie er kann immer wieder den aktuellen Strom abruft.
Gibt es eine möglichkeit dies zu reduzieren, also das er nicht 100% Leistung verbraucht?

Würde mich über Antworten freuen.

MfG
ReBeL


JüTho - Mi 27.02.08 11:18

Zu 1. Das benötigt zwei Maßnahmen:

C#-Quelltext
1:
2:
3:
void ButtonCancelClick(object sender, EventArgs e) {
    worker.CancelAsync();
}

Sobald diese Methode aufgerufen wurde, wird BackgroundWorker.CancellationPending auf true gesetzt. Dieser Wert ist zusätzlich im eigentlichen Programmablauf abzufragen, damit Schleifen gezielt beendet werden können, z.B. innerhalb eines FileStreams:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
using(FileStream fs = new FileStream(...)) {
  int blocksize = 256;
  byte[] blockContent = new byte[blocksize];
  do {
    fs.Read(blockContent, 0, blocksize);
    //  diese Daten verarbeiten
  } while(fs.Position < fs.Length && !worker.CancellationPending);
}

Ergänzend können innerhalb von WorkerCompleted unterschiedliche Maßnahmen danach getroffen werden, ob der BackgroundWorker "normal" oder "abrupt" abgeschlossen wurde; siehe auch das Beispiel zur BackgroundWorker-Klasse in der SDK-Doku.

Gruß Jürgen


ReBeL1337 - Mi 27.02.08 11:51

Danke hat geholfen.


ReBeL1337 - Mi 27.02.08 14:01

Hätte jemand eine Lösung für das 2. Problem?
MfG


Christian S. - Mi 27.02.08 14:26

Hallo!

Im Forum gilt die Regel: Eine Frage pro Thread. Bitte stelle die zweite Frage in einem eigenen Thread, bei dem Du dann auch einen spezifischeren Titel wählen kannst. Somit kann dann jemand, der dasselbe Problem hat, schneller erkennen, dass der Thread für ihn interessant ist. Danke! :)

Da die erste Frage beantwortet ist, mache ich hier zu.

Grüße
Christian

P.S.: Den Title dieses Threads passe ich auf die erste Frage an.