Autor Beitrag
ReBeL1337
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 22



BeitragVerfasst: Mi 27.02.08 12:03 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Mi 27.02.08 12:18 
Zu 1. Das benötigt zwei Maßnahmen:
ausblenden 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:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 22



BeitragVerfasst: Mi 27.02.08 12:51 
Danke hat geholfen.
ReBeL1337 Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 22



BeitragVerfasst: Mi 27.02.08 15:01 
Hätte jemand eine Lösung für das 2. Problem?
MfG
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mi 27.02.08 15: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.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Dieses Thema ist gesperrt, Du kannst keine Beiträge editieren oder beantworten.

Das Thema wurde von einem Team-Mitglied geschlossen. Wenn du mit der Schließung des Themas nicht einverstanden bist, kontaktiere bitte das Team.