Problem mit dem Backgroundworker

  • VB.NET

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von soli.

    Problem mit dem Backgroundworker

    Hallo zusammen!

    Ich benutze einen Backgroundworker um im Hintergrund einen Chipleser abzufragen. Das funktioniert auch wunderbar, allerdings läuft die Abfrage immer nur einmal durch, ich möchte den Leser aber ständig abfragen solange Form1 aktiv ist.

    Wie im Quellcode zu sehen habe ich dafür eine While schleife + Abbruch Bedingung eingebaut, diese funktioniert ebenfalls, allerdings wird meine RunWorker_Completed Prozedur nicht aufgerufen und mir ist im Moment nicht ganz klar, woran das liegt.

    Ich muss gestehen, dass ich nicht viel Ahnung von VB habe, wahrscheinlich ist das Problem ziemlich einfach und ich sehe es nur nicht. Auf jeden Fall bin ich für jede Hilfe dankbar.

    VB.NET-Quellcode

    1. Public Sub bgthread_DoWork( _ByVal sender As Object, _
    2. ByVal e As System.ComponentModel.DoWorkEventArgs) _Handles bgthread.DoWork
    3. While bgthread.IsBusy
    4. customerNumber = 0
    5. status = getMC(2, customerNumber)
    6. If status = 0 Then
    7. bgthread.CancelAsync()
    8. End If
    9. End While
    10. End Sub
    11. Public Sub bgthread_RunWorkerCompleted( _ByVal sender As Object, _
    12. ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) _ Handles bgthread.RunWorkerCompleted
    13. MsgBox(customerNumber, vbOKOnly)
    14. If Not customerNumber = 0 Then
    15. Form2.box_ID.Text = customerNumber
    16. hooter_if(10, 2)
    17. Form2.box_Gericht.Text = "Salat"
    18. customerNumber = 0
    19. Form2.Show()Call Form2.acceptinfo()
    20. Else
    21. End If
    22. End Sub


    Wenn ich die While Schleife rausnehme und der Thread ganz normal bis zum Ende durchläuft funktioniert es, ich glaube deshalb, dass es an dem Cancel Befehl liegt. Allerdings sollte die Prozedur doch auch bei einem Abbruch aufgerufen werden, oder sehe ich das jetzt falsch?
    Die while-Schleife die du benutzt dürfte eine Endlosschleife darstellen soweit ich mich nicht irre.
    Schau, du lässt die Schleife solange arbeiten, wie der aktuelle Backgroundworker beschäftigt ist.
    Durch den Durchlauf der Schleife ist er praktisch ununterbrochen beschäftigt, der Wert wird somit nie auf False gesetzt, d.H. die Schleife läuft ununterbrochen.

    ~ Chris
    To make foobar2000 a real random music player, I figured out the only way to achieve this is to use Windows Media Player.

    At some point in time, you recognize that knowing more does not necessarily make you more happy.
    Danke, daran lags!

    Habe es jetzt folgendermaßen gelöst:

    VB.NET-Quellcode

    1. Public Sub bgthread_DoWork( _ByVal sender As Object, _
    2. ByVal e As System.ComponentModel.DoWorkEventArgs) _Handles bgthread.DoWork
    3. customerNumber = 0
    4. status = getMC(2, customerNumber)
    5. If status = 0 Then
    6. bgthread.CancelAsync()
    7. End If
    8. End Sub
    9. Public Sub bgthread_RunWorkerCompleted( _
    10. ByVal sender As Object, _ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) _
    11. Handles bgthread.RunWorkerCompleted
    12. If Not customerNumber = 0 Then
    13. 'Hier steht die Prozedur
    14. Else
    15. bgthread.RunWorkerAsync()
    16. End If
    17. End Sub