4 Stimmen

Wie verwende ich Backgroundworker, um ein Formular zu laden?

Wenn ich versuche, ein Formular mit einer BackgroundWorker-Klasse zu laden, wird eine Ausnahme ausgelöst, weil ich versucht habe, auf ein Objekt zuzugreifen, das von einem anderen Thread erstellt wurde, nicht vom aktuellen Thread. Wie kann ich dieses Formular mit dem BackgroundWorker laden?

(Ich suche nach einer Marquee-Fortschrittsleiste, während das Formular geladen wird)

2voto

fotijr Punkte 816

Sie können keine Steuerelemente im DoWork-Bereich eines BackgroundWorkers ändern, da es sich um einen separaten Thread handelt. Sie sollten jegliche Daten im DoWork-Bereich verarbeiten und dann Ihr Formular im RunWorkerCompleted-Bereich aktualisieren.

Beispiel:

Private WithEvents bgwTasks As New BackgroundWorker

Private Sub bgwTasks_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bgwTasks.DoWork
e.Result= GetDatabaseTable()
End Sub

Private Sub bgwTasks_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles bgwTasks.RunWorkerCompleted
    If e.Result IsNot Nothing Then
        DataGridView1.DataSource = e.Result
    End If

Private Sub Main_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load If bgwTasks.IsBusy = False Then bgwTasks.RunWorkerAsync() End If End Sub

0voto

Ruben_PH Punkte 1682

Das deaktiviert die Überprüfung auf Cross-Threads.

Me.CheckForIllegalCrossThreadCalls = False

Ich empfehle immer noch, nach Cross-Threads zu suchen, was die richtige Verwendung der BackgroundWorker-Klasse betrifft.

0voto

Ryszard Dżegan Punkte 22810

Es besteht kein Problem, das zweite Formular in einem anderen Thread zu initialisieren, aber wenn Sie es im Kontext Ihres Hauptformulars verwenden möchten, müssen Sie den ursprünglichen Thread verwenden. Der folgende Code erstellt und initialisiert ein neues Formular im Hintergrundarbeiter und zeigt es dann an, wenn die Initialisierung in einem geeigneten Ereignisbehandler abgeschlossen ist:

Public Class Form1
Dim form2 As Form2

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    BackgroundWorker1.RunWorkerAsync()
End Sub

Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    form2 = New Form2()
    form2.TextBox1.Text = "Text"
End Sub

Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As System.Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
    form2.Show()
End Sub
End Class

Sie können das ProgressChanged-Ereignis des Hintergrundarbeiters verwenden, um den Fortschritt an die Fortschrittsanzeige zu melden.

0voto

Steven Licht Punkte 760

Sie können das nicht tun. Formulare haben Thread-Affinität. d.h. sie können NUR von dem Thread zugegriffen werden, der das Formular instanziiert hat. Ihr Hintergrund-Thread wurde gerade zum UI-Thread für das Formular! Also was Sie TUN MÜSSEN, ist den Aufruf auf den richtigen Thread zu überführen. Überprüfen Sie InvokeRequired. Wenn wahr, instantiieren Sie ein Delegat, rufen Sie BeginInvoke auf und geben Sie SOFORT zurück. Jetzt wird der Aufruf auf den richtigen Thread überführt werden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X