| Autor |
Beitrag |
peterbe
      
Beiträge: 21
|
Verfasst: Sa 02.08.14 22:54
hallo,
ich arbeite zum Ersten Mal mit dem Backgroundworker und bin auf ein Problem gestoßen.
Über ein Start-Button starte ich eine Anlage.
Wenn ich nun den Abbrech-Button betätige, wird der Abbruch-Code ausgeführt(Alle Ports am Modul auf false), aber dann läuft die Anlage von selber weiter,wo ich abgebrochen habe.
Dies soll aber verhindert werden.
Könnt ihr mir helfen?
mfg
peter
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: So 03.08.14 00:02
Ohne dass Du den relevanten Quelltext zeigst, wird Dir da niemand helfen können. Das sind einfach zu wenig Informationen. 
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
avoid
      
Beiträge: 230
Erhaltene Danke: 4
MSDos, WinXP32, Win764, Win10, Android, Debian
msl (mIRC edit), html & php & Java (DreamweaverMX), Basic (picaxe PE6), C (Arduino IDE), C# (vs2010,2015,2017,2019,Unity,Android Studio)
|
Verfasst: So 03.08.14 02:19
mir stellen sich zwei fragen.
- was macht dein Stopp Button?
- benutzt du "backgroundWorker1.CancelAsync();" ?
wie auch immer, ich hänge dir mal ein mini Projekt an.
damit hab ich den BG-Worker erforscht.
da kannst du evtl. was abkucken.
Einloggen, um Attachments anzusehen!
_________________ Gute Fragen sind wie ein wissenschaftliches Experiment. Sie setzen eine Menge Wissen bereits voraus.
bitcoin:1J5dgQQp8eUy8wkUxyztBUVCkCpo5MQEQs?label=Danke
|
|
peterbe 
      
Beiträge: 21
|
Verfasst: So 03.08.14 20:09
Danke zunächst!!!
HIer mal mein Code
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| private void btn1_Click(object sender, EventArgs e) { if (!backgroundWorker1.IsBusy) { backgroundWorker1.RunWorkerAsync(); } }
private void button1_Click(object sender, EventArgs e) { if (backgroundWorker1.IsBusy) { backgroundWorker1.CancelAsync(); } } private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { } |
Wenn ich den Stop Button betätige, soll die for SChleife jederzeit abgebrochen werden.
Und erst bei erneuten Betätigen des Start Button Neustarten.
Werde leider durch dein Beispiel nicht schlau:(
Moderiert von Christian S.: C#-Tags hinzugefügt
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: So 03.08.14 20:33
Prüfst du denn auch auf CancellationPending irgendwo in deiner DoWork Methode?
|
|
peterbe 
      
Beiträge: 21
|
Verfasst: So 03.08.14 21:32
Ne nicht wirklich.
Wie muss ich den denn einbinden?
|
|
Palladin007
      
Beiträge: 1282
Erhaltene Danke: 182
Windows 11 x64 Pro
C# (Visual Studio Preview)
|
Verfasst: So 03.08.14 21:53
Naja, das einzige, was die CancleAsync-Methode tut, ist den Wert der CancellationPending-Property auf true zu setzen.
Mehr passiert da nicht.
Deshalb gibt es den sender-Parameter, der ist bei Events immer das Objekt, welches das Event ausgelöst hat.
In deinem Fall also dein BackgroundWorker-Objekt.
Du musst in der DoWork-Methode also direkt bei jedem Schleifendurchlauf den Zustand der CancellationPending-Property prüfen und die Schleife abbrechen, wenn es gefordert wird.
Das hat den Sinn, dass der Hintergrund-Thread nicht einfach hart abgebrochen wird und irgendwelche Objekte in irgendeinem unbekannten oder nicht funktionsfähigen Zustand zurück lässt.
So kannst du den Abbruch einleiten und dafür Sorge tragen, dass der auch sauber und kontrolliert ab läuft.
|
|
peterbe 
      
Beiträge: 21
|
Verfasst: Mo 04.08.14 12:51
Super Danke!
Mit der CancellationPending Abfrage funktionierts-
|
|
avoid
      
Beiträge: 230
Erhaltene Danke: 4
MSDos, WinXP32, Win764, Win10, Android, Debian
msl (mIRC edit), html & php & Java (DreamweaverMX), Basic (picaxe PE6), C (Arduino IDE), C# (vs2010,2015,2017,2019,Unity,Android Studio)
|
Verfasst: Mo 04.08.14 23:11
hier nochmal der ausschnitt der Methode wie er in meinem Beispiel zu finden ist.
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { int percentFinished = (int)e.Argument; while (!backgroundWorker1.CancellationPending && percentFinished < 100) { percentFinished++; backgroundWorker1.ReportProgress(percentFinished); System.Threading.Thread.Sleep(50); } e.Result = percentFinished; } |
ich lasse den backgroundWorker quasi solange abarbeiten wie kein "Abbrechen" zur Verarbeitung an steht.
in der schleife kann ich dann alles verarbeiten lassen.
der Thread.Sleep(50) verzögert nur die Arbeit damit der Balken nicht sofort voll ist.
ist leider schon einige Jahre alt das Projekt, so 100% im Kopf hab ich das nicht mehr.
hoffe die kleine Erklärung hilft beim Verständnis.
Gruß,
avoid
_________________ Gute Fragen sind wie ein wissenschaftliches Experiment. Sie setzen eine Menge Wissen bereits voraus.
bitcoin:1J5dgQQp8eUy8wkUxyztBUVCkCpo5MQEQs?label=Danke
|
|
|