Guten Morgen,
bis dato bin ich beim Thema Threading immer recht gut mit dem Backgroundworker gefahren, die häufigsten Anwendungen waren die Überbrücken längerer Aufbauzeiten von Fenstern und Tabellen, sowie "Wartefenster" - wenn ein lang andauernder Prozess aufgerufen wurde.
Nun stehe ich leider vor einem kleinen Problem, dass mir die Verwendung vom BGW verhindert.
Hintergrund ist folgender:
Ein größerer Datensatz wird aus einer Exceltabelle gezogen, angepasst und in einem Datagridview angezeigt. Das geschieht momentan in einem Backgroundworker, da je nach Anzahl der Daten, der Aufbau auch mal 30 Sekunden brauchen kann (während dessen gibt es visuelles Feedback in Form eines Wartebildschirms).
Da der Inhalt der Datagridview durch den Backgroundworker entsteht, ist es nicht möglich das Clipboard im Bezug auf das Datagridview zu verwenden - was aber notwendig ist (Fehlermeldung: Für den aktuellen Thread muss der STA-Modus (Single Thread Apartment) festgelegt werden, bevor OLE-Aufrufe ausgeführt werden können. Stellen Sie sicher, dass die Hauptfunktion mit STAThreadAttribute gekennzeichnet ist.).
Nun möchte ich anstelle eines Backgroundworkers zu Threading wechseln und stehe da noch vor ein, zwei Verständnisproblemen.
Mein momentaner BGW Code sieht in etwa so aus:
Nun den BGW durch Threading ersetzt. Da ich im Prinzip nur einen Thread im Hintergrund brauche, dachte ich, ich kann es recht simpel halten:
Folgendes (Verständnis-)Problem:
Ich muss ja irgendwie abfangen, wann der Thread beendet ist, um dann den Wartebildschirm zu schließen. Ich dachte das ist möglich via Join(). Das hält jedoch mein Hauptprogramm (bzw. den Code vom Hauptthread) an, weswegen der Wartebildschirm nicht angezeigt wird, sondern alles einfriert.
Kann mir jmd da einen Denkanstoss geben, wie ich zum gewünschten Resultat komm?
Danke und Grüße
bis dato bin ich beim Thema Threading immer recht gut mit dem Backgroundworker gefahren, die häufigsten Anwendungen waren die Überbrücken längerer Aufbauzeiten von Fenstern und Tabellen, sowie "Wartefenster" - wenn ein lang andauernder Prozess aufgerufen wurde.
Nun stehe ich leider vor einem kleinen Problem, dass mir die Verwendung vom BGW verhindert.
Hintergrund ist folgender:
Ein größerer Datensatz wird aus einer Exceltabelle gezogen, angepasst und in einem Datagridview angezeigt. Das geschieht momentan in einem Backgroundworker, da je nach Anzahl der Daten, der Aufbau auch mal 30 Sekunden brauchen kann (während dessen gibt es visuelles Feedback in Form eines Wartebildschirms).
Da der Inhalt der Datagridview durch den Backgroundworker entsteht, ist es nicht möglich das Clipboard im Bezug auf das Datagridview zu verwenden - was aber notwendig ist (Fehlermeldung: Für den aktuellen Thread muss der STA-Modus (Single Thread Apartment) festgelegt werden, bevor OLE-Aufrufe ausgeführt werden können. Stellen Sie sicher, dass die Hauptfunktion mit STAThreadAttribute gekennzeichnet ist.).
Nun möchte ich anstelle eines Backgroundworkers zu Threading wechseln und stehe da noch vor ein, zwei Verständnisproblemen.
Mein momentaner BGW Code sieht in etwa so aus:
VB.NET-Quellcode
- ' Backgroundworker starten
- bgwLoadWindow.RunWorkerAsync()
- ' Wartebildschirm anzeigen
- winWaitingScreenLoadWindow.Show()
- ' -----------------
- Private Sub bgwLoadWindow_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bgwLoadWindow.DoWork
- ' Funktion zum Laden des Bildschirms aufrufen
- Testfunktion()
- End Sub
- Private Sub bgwLoadWindow_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles bgwLoadWindow.RunWorkerCompleted
- ' wenn das Fenster aufgebaut ist, den Wartebildschirm schließen
- If Not winWaitingScreenLoadWindow Is Nothing Then
- winWaitingScreenLoadWindow.Dispose()
- winWaitingScreenLoadWindow = Nothing
- End If
- End Sub
Nun den BGW durch Threading ersetzt. Da ich im Prinzip nur einen Thread im Hintergrund brauche, dachte ich, ich kann es recht simpel halten:
VB.NET-Quellcode
Folgendes (Verständnis-)Problem:
Ich muss ja irgendwie abfangen, wann der Thread beendet ist, um dann den Wartebildschirm zu schließen. Ich dachte das ist möglich via Join(). Das hält jedoch mein Hauptprogramm (bzw. den Code vom Hauptthread) an, weswegen der Wartebildschirm nicht angezeigt wird, sondern alles einfriert.
Kann mir jmd da einen Denkanstoss geben, wie ich zum gewünschten Resultat komm?
Danke und Grüße