Backgroundworker?
- VB.NET
Sie verwenden einen veralteten Browser (%browser%) mit Sicherheitsschwachstellen und können nicht alle Funktionen dieser Webseite nutzen.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Es gibt 25 Antworten in diesem Thema. Der letzte Beitrag () ist von singu.
-
-
[VB 2008] Backgroundworker
Hatten wir hier zu oft..
Suchfunktion benutzen ist klarer Vorteil.
//Edit: In diesem Breitrag gleich ganz unten stehen auch die anderen Themen die sich mit Backgroundworker (o.ä.) befassen."Wenn jemand in einem Betrieb unverzichtbar ist, dann ist dieser Betrieb falsch organisiert." - Roberto Niederer -
Ich denke hier steht alles drin:
msdn Backgroundworker-Komponente -
Hallo,
hier ein kleines BackGroundWorker Tutorial.
VB.NET-Quellcode
- Imports System.ComponentModel
- Public Class Form1
- Private WithEvents bgw As New BackgroundWorker
- Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
- 'so startet man den bgw
- bgw.RunWorkerAsync()
- 'evtl. kann man etwas mit übergeben
- bgw.RunWorkerAsync("Dem bgw etwas mitgeben")
- End Sub
- Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
- 'prüft ob der bgw noch läuft und beendet diesen dann
- 'bedingung - siehe form_load
- If bgw.IsBusy Then
- bgw.CancelAsync()
- End If
- End Sub
- Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
- 'erlaubt zugriff auf die windows form
- bgw.WorkerReportsProgress = True
- 'erlaubt unterbrechung des bgw z.b. wenn das programm beendet wird
- bgw.WorkerSupportsCancellation = True
- End Sub
- #Region "BackGroundWorker Events"
- Private Sub bgw_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bgw.DoWork
- 'hier steht alles drinn, was im bgw abgearbeitet werden soll.
- 'um etwas in der windows form (anderer prozess) ausgeben zu können muss das
- 'bgw_progesschanged event ausgelöst werden
- 'z.b. so
- bgw.ReportProgress(100) 'die 100 steht hier für einen prozentsatz
- 'oder
- bgw.ReportProgress(100, "Muss was Ausgeben.") 'im zweiten parameter kann ein objekt übergeben werden
- End Sub
- Private Sub bgw_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles bgw.ProgressChanged
- 'von hier aus, kann auf die windows forms zugegriffen werden
- 'aber auch nur von hier aus
- End Sub
- Private Sub bgw_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles bgw.RunWorkerCompleted
- 'dieses event wird angesprungen, wenn alles was in bgw_dowork abgearbeitet wurde.
- End Sub
- #End Region
- End Class
gruss
mikeb69 -
-
hallo,
passend zum thema:
ich nutze den bgw nun zum ersten mal. wenn ich nun meinen beispielcode benutze, kommt der fehler:
Ungültiger threadübergreifender Vorgang: Der Zugriff auf das Steuerelement Label1 erfolgte von einem anderen Thread als dem Thread, für den es erstellt wurde.
VB.NET-Quellcode
- Private Sub bgw_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bgw.DoWork
- Dim p As Long
- For i As Integer = 0 To 100000000
- p += 1
- Next
- Label1.Text = p
- End Sub
- Private Sub bgw_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles bgw.RunWorkerCompleted
- MsgBox("Ende")
- End Sub
kann mir jmd erklären, wie man das nun machen muss?
dankeFür ein Mindestmaß an Rechtschreibung, Interpunktion und Majuskeln! -
-
.... Liess deine Fehlermeldung, dann das obige Tutorial nochmals...
(Im DoWork Event kannst du nicht auf deine Form zugreifen. Nimm :
Private Sub bgw_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles bgw.ProgressChanged
'von hier aus, kann auf die windows forms zugegriffen werden
'aber auch nur von hier aus
End Sub
"I think Microsoft has abused the Windows brand so much that it has lost its cachet."
Paul Thurrott -
aaah, danke. jetzt versteh ich:
man mussVB.NET-Quellcode
- Private Sub bgw_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bgw.DoWork
- Dim p As Long
- For i As Integer = 0 To 100000000
- p += 1
- Next
- bgw.ReportProgress(100, p) 'im zweiten parameter kann ein objekt übergeben werden
- End Sub
- Private Sub bgw_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles bgw.ProgressChanged
- Label1.Text = e.UserState.ToString
- End Sub
nutzen.
aber es folgt gleich die nächste frage
wenn der thread läuft, und ich
nutze, sollte der thread doch eigentlich abgebrochen sein. aber dennoch wird bei mir das RunWorkerCompleted-event ausgelöst, genauso wie das ProgressChanged-event. woran könnte das liegen?...
DankeFür ein Mindestmaß an Rechtschreibung, Interpunktion und Majuskeln! -
-
-
Hey,
der Worker beendet sich nicht selber. Die Methode CancelAsync setzt lediglich die Variable CancellationPending des Workers auf True, welche du im DoWork-Event abfragen musst um dieses dann frühzeitig, z.B. mit Exit Sub, zu beenden.
Cheerio -
-
Hab zu dem Abbrechen auch nochmal eine Frage.
Im Moment nutze ich folgenden Code:
VB.NET-Quellcode
- Private Sub frm_Optimieren_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
- If bgw_Optimierung.IsBusy Then
- bgw_Optimierung.CancelAsync()
- End If
- End Sub
- Private Sub bgw_Optimierung_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bgw_Optimierung.DoWork
- If bgw_Optimierung.CancellationPending Then 'Wurde Abbrechen aufgerufen?
- e.Cancel = True 'Abbrechen
- Exit Sub
- Else
- Try
- 'Datenbank optimieren
- myConnection.Open() 'Connection öffnen
- myCommand = New SQLiteCommand("VACUUM Einträge; VACUUM Kategorien", myConnection) 'Command festlegen
- myCommand.ExecuteNonQuery() 'Command ausführen
- myConnection.Close() 'Connection schliesen
- Catch ex As Exception
- MessageBox.Show(ex.Message)
- End Try
- End If
- End Sub
- Private Sub bgw_Optimierung_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles bgw_Optimierung.RunWorkerCompleted
- If (e.Error IsNot Nothing) Then 'Bei Fehler
- MessageBox.Show("Folgender Fehler ist aufgetreten: " & vbNewLine & e.Error.Message, "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error)
- ElseIf e.Cancelled Then 'Bei Abbruch
- MessageBox.Show("Der Vorgang wurde abgebrochen.", "Abbruch", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
- Else 'Bei Erfolg
- MessageBox.Show("Optimierung erfolgreich abgeschlossen", "Optimierung abgeschlossen", MessageBoxButtons.OK, MessageBoxIcon.Information)
- End If
- Me.Close()
- End Sub
Das Problem:
Beim Schliesen der Form wird zwar das .CancelAsync() aufgerufen, jedoch kommt immer noch die Meldung das die Optimierung erfolgreich war. Was mache ich da falsch?wintoolz.de- wintoolz.KeyLocker - Programm zum sicheren Verwalten von Passwörten
- wintoolz.CodeGallery - Datenbank für Codebeispiele veschiedener Programmiersprachen
- wintoolz.Haushaltsbuch - Dient zum Auflisten der Aktivitäten ihrer Bankkonten
Benutze auch du Ecosia -
Hi T1g0r,
das Problem ist, dass der Code welcher das e.Cancel auf True setzt wohl nie aufgerufen wird. Es wird ja gleich beim initialisieren des Do-Work Events geprüft ob der Nutzer auf Abbrechen geklickt hat und danach wird der Datenbankquery ausgeführt und zum schluß die Funktion beendet. Daher würde es wohl am meisten Sinn machen die Abfrage ob der Worker abgebrochen wurde ans Ende der Funktion zu verlagern. Das hat allerdings nur kosmetischen Nutzen, denn wirklich Abbrechen kannst du den Worker in diesem Fall nicht, da er erstmal den DB-Query synchron abarbeitet und dabei nicht nachschaut ob der Benutzer auf Abbrechen geklickt hat.
Cheerio -
OK, das hab ich mir schon fast gedacht.
Dankewintoolz.de- wintoolz.KeyLocker - Programm zum sicheren Verwalten von Passwörten
- wintoolz.CodeGallery - Datenbank für Codebeispiele veschiedener Programmiersprachen
- wintoolz.Haushaltsbuch - Dient zum Auflisten der Aktivitäten ihrer Bankkonten
Benutze auch du Ecosia - wintoolz.KeyLocker - Programm zum sicheren Verwalten von Passwörten
-
Ich hänge mich mal hier rein.
Ich wollte mal die Sache mit dem Backgroundworker testen, aber nun stehe ich vor einem Problem. Im Backgroundworker soll eine Variable aus dem normalen Programmbereich verwendet werden. Allerdings ist diese leer, wenn ich sie im Backgroundworker aufrufe. Wie kann ich auf die Variable zugreifen, damit das nicht der Fall ist? -
Damit solltest du ganz normal arbeiten können. Das diese Variable leer ist, dürfte nicht am Backgroundworker liegen.wintoolz.de
- wintoolz.KeyLocker - Programm zum sicheren Verwalten von Passwörten
- wintoolz.CodeGallery - Datenbank für Codebeispiele veschiedener Programmiersprachen
- wintoolz.Haushaltsbuch - Dient zum Auflisten der Aktivitäten ihrer Bankkonten
Benutze auch du Ecosia - wintoolz.KeyLocker - Programm zum sicheren Verwalten von Passwörten
-
-
-
Ähnliche Themen
-
wamborambo - - Sonstige Problemstellungen
-
Alex034 - - Sonstige Problemstellungen