www.mikrocontroller.net

Forum: PC-Programmierung [C#] Backgroundworker


Autor: Dex Dexter (dexter)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen

Ich habe ein Problem mit dem Backgroundworker. Und zwar rufe ich eine 
Endlosschlaufe, welche immer überprüft ob abgebrochen wurde, auf. Nun 
kann ich diese aber nicht mehr beenden.
        private void main()
        {
            bw.RunWorkerAsync();
            if (MessageBox.Show("writing data finished!\r\npress ok to continue...") == DialogResult.OK)
            {
                bw.CancellationPending=true
            }
        }

        private void bw_DoWork(object sender, DoWorkEventArgs e)
        {
            PBSendData(0xF0);
            PBSendData(0x00);
            PBSendData(0x00);
            for (int j = 0; j < 3; j++)
            {
                readData();
            }
            for ( int i = 0; i < 1; i = 0)
            {
                PBSendData(0xFF);
                readData();
                if (bw.CancellationPending)
                {
                    e.Cancel = true;
                    return;
                }
            }
            
        }


Gruss Dexter

Autor: Chris ... (dechavue)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Probiers einfach mal mit bw.CancelAsync();
die Eigenschaft ist meines Wissens Read-Only.

Siehe auch 
http://msdn.microsoft.com/en-us/library/system.com...

PS:
besser wäre:
while( !bw.CancellationPending) {
  PBSendData(0xFF);
  readData();
} 
e.Cancel = bw.CancellationPending;
so ist auf den ersten Blick erkennbar, wodurch die Schleife beendet 
werden kann und dass es sich nicht um eine "Zählschleife" handelt

Autor: Dex Dexter (dexter)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habs jetzt so wie du es gesagt hast. Doch wenn ich wieder zu 
bw.RunWorkerAsync() komme, gibt er die Meldung, dass er noch beschäftigt 
sei...

Autor: Chris ... (dechavue)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ahh, das heißt, das Abbrechen Funktioniert aber du kannst ihn nicht neu 
starten.

Versuchst du den Neustart sofort nach dem CancelAsync()? vieleicht ist 
der BW wirklich noch nicht fertig und hängt noch in z.B. der readData 
Methode.

Ansonsten gäbe es noch den Hack, einfachden BW neu zu erzeugen also 
folgendermaßen:
private BackgroundWorker bw = null;

        private void main()
        {
            StartBW();
            if (MessageBox.Show("writing data finished!\r\npress ok to continue...") == DialogResult.OK)
            {
                bw.CancellationPending=true
            }
        }

  private void StartBW() {
    if(bw != null) {
      bw.DoWork -= bw_DoWork;
      bw.Dispose();
    }
    bw = new BackgroundWorker();
    bw.DoWork += bw_DoWork;
    bw.RunWorkerAsync();
  }

        private void bw_DoWork(object sender, DoWorkEventArgs e)
        {
            PBSendData(0xF0);
            PBSendData(0x00);
            PBSendData(0x00);
            for (int j = 0; j < 3; j++)
            {
                readData();
            }
            while( !bw.CancellationPending) {
              PBSendData(0xFF);
              readData();
            } 
            e.Cancel = bw.CancellationPending;
        }

Alles ohne Garantie auf Richtigkeit, da ich im Mom leider kein VS zur 
verfügung hab.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.