PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : BackgroundWorker Fehler



c2x
05.05.2010, 15:15
Der BackgroundWorker ist ausgelastet und kann nicht mehrere Aufgaben gleichzeitig ausführen. Diese Fehlermeldung erscheint bei mir.

Code:


Imports System.Net
Imports System.IO
Imports System.Text.RegularExpressions

Public Class frmMain

'[...] Unwichtiger code ;)
'Timer wird durch Button gestartet

Private Sub tmrCheck_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tmrCheck.Tick
bgWorker.RunWorkerAsync() 'BG Worker wird gestartet
End Sub

Private Sub bgWorker_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bgWorker.DoWork
Try
Dim httpRequest As HttpWebRequest = HttpWebRequest.Create(txtURL.Text)
Dim httpResponse As HttpWebResponse = httpRequest.GetResponse()
Dim reader As StreamReader = New StreamReader(httpResponse.GetResponseStream)
Dim httpContent As String = reader.ReadToEnd
txtContent.Text = httpContent
If txtContent.Text.Contains(txtString.Text) = True Then
notifyCheck.ShowBalloonTip(10000, "Anwendung", "Neues Ergebnis bei: " & txtURL.Text, ToolTipIcon.Info)
txtString.Clear()
End If
Catch ex As Exception
MsgBox("Es ist ein Fehler während der Verbindung zu: " & txtURL.Text & " aufgetreten." & vbCrLf & _
"Überprüfen Sie Ihre Internetverbindung.", MsgBoxStyle.Information, "Anwendung")
End Try
Try
bgWorker.CancelAsync()
Catch ex As Exception
MsgBox("Der Hintergrundprozess konnte nicht geschlossen werden. Die Anwendung wird sich schließen.", MsgBoxStyle.Information, _
"Anwendung")
Application.Exit()
End Try
End Sub
End Class

Woran liegt der Fehler. Schließlich lasse ich nach jedem Timer Intervall den BG-Worker neu starten.

hackerking
05.05.2010, 15:26
Schließlich lasse ich nach jedem Timer Intervall den BG-Worker neu starten.

Völlig falsch.
Du müsstest jedes mal einen neuen BG Worker deklarieren, da der andere ja immer noch arbeitet. .NET stoppt den Thread nicht, auch nicht, wenn du den Thread neu startest, oder mit CancelAsynch unterbrichts.

PS: Es müsste .Abort und nicht CancelAsynch heißen oder?

krusty
05.05.2010, 16:02
Mach es anders.
also du startest den backgroundworker im form1 load event.
im backgroudworker mach ne while true (eine endlosschleife) rein und lässt nach jedem schleifen durchlauf mit sys.threading.thread.sleep(1000) sein programm eine bestimmte zeit warten.



Private Sub bgWorker_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bgWorker.DoWork
while true
Try
Dim httpRequest As HttpWebRequest = HttpWebRequest.Create(txtURL.Text)
Dim httpResponse As HttpWebResponse = httpRequest.GetResponse()
Dim reader As StreamReader = New StreamReader(httpResponse.GetResponseStream)
Dim httpContent As String = reader.ReadToEnd
txtContent.Text = httpContent
If txtContent.Text.Contains(txtString.Text) = True Then
notifyCheck.ShowBalloonTip(10000, "Anwendung", "Neues Ergebnis bei: " & txtURL.Text, ToolTipIcon.Info)
txtString.Clear()
End If
Catch ex As Exception
MsgBox("Es ist ein Fehler während der Verbindung zu: " & txtURL.Text & " aufgetreten." & vbCrLf & _
"Überprüfen Sie Ihre Internetverbindung.", MsgBoxStyle.Information, "Anwendung")
End Try
sys.threading.thread.sleep(1000)'eine sekunde warten
end while
End Sub

@hackerking, nein abort ist bei einem thread objekt.

c2x
05.05.2010, 17:08
@hackerking Abort geht nicht (achso, Krusty hatte es schon geschrieben... ;) )

@Krusty: Danke, dass war nun das erste mal, dass ich einen Background Worker verwendet habe. Zuerst hatte ich den Webrequest per Timer immer wieder ausgeführt, allerdings hat das Programm dann einige Sekunden (nach dem Intervall) nicht mehr reagiert.

Edit:

Folgendes gemacht. Timer beide entfernt, BGW wird nun über einen Button gestartet:

Private Sub btnStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStart.Click
bgWorker.RunWorkerAsync()
notifyCheck.ShowBalloonTip(1000, "anwendungsname", "Verbindung zu: " & txtURL.Text & " wird hergestellt.", ToolTipIcon.Info)
End Sub

Die BGW Klasse sieht nun folgendermaßen aus:

Private Sub bgWorker_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bgWorker.DoWork
While True
Try
Dim httpRequest As HttpWebRequest = HttpWebRequest.Create(txtURL.Text)
Dim httpResponse As HttpWebResponse = httpRequest.GetResponse()
Dim reader As StreamReader = New StreamReader(httpResponse.GetResponseStream)
Dim httpContent As String = reader.ReadToEnd()
txtContent.Text = httpContent
If txtContent.Text.Contains(txtString.Text) = True Then
notifyCheck.ShowBalloonTip(10000, "c2x postchecker", "Neues Ergebnis bei: " & txtURL.Text, ToolTipIcon.Info)
txtString.Clear()
End If
Catch ex As Exception
MsgBox("Es ist ein Fehler während der Verbindung zu: " & txtURL.Text & " aufgetreten." & vbCrLf & _
"Überprüfen Sie Ihre Internetverbindung.", MsgBoxStyle.Information, "irgendein name")
End Try
Application.Exit()
Thread.Sleep(2000)
End While
End Sub

Allerdings scheint die Routine fehlerhaft abzulaufen, denn die Exception wird nun nach jedem mal Starten (des BGW) mit etwas Zeitverzögerung angezeigt.

Anscheinend liegt es am Webrequest, wobei ich an sich keinen Fehler feststellen kann.