VisualBasic VB 2010 Express - ThreatStateExeption Error STA beim Backgroundworker

Garack

Captain
Registriert
Mai 2006
Beiträge
3.583
Hallo, ich bin totaler Einsteiger in VB und versuche mich an einem PRG welches Files kopiert. Dieses zählt bei Quell-Ordner-Auswahl die Anzahl der Files in dem Ordner und gibt die Anzahl aus auf Label3.

Funktioniert auch, nur das bei hoher Files Anzahl sagen wir 50.000 das PRG hängt, aber fehlerfrei weitermacht. Um diese Hängen zu vermieden dachte ich ich nutze einen Backgroundworker.
Das Fenster sollte dann ja noch reagieren und der user weiß das es nicht gecrashed ist...Dachte ich.... ist das korrekt?
Das Problem ist das der Fehler "Für den aktuellen Thread muss der STA-Modus (Single Thread Apartment) festgelegt werden,..." erscheint in Zeile 53. Wie kann ich den beseitigen?

Code:
Imports System.IO

Public Class Form1


    Dim sourcepfad As String = Nothing

    'Ende Button

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Close()
    End Sub

    'Quelle Wählen

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

        BackgroundWorker1.RunWorkerAsync()


    End Sub

    ' Ziel wälen

    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        Dim OrdnerZeigen1 As FolderBrowserDialog = New FolderBrowserDialog
        OrdnerZeigen1.RootFolder = Environment.SpecialFolder.MyComputer


        [B]If OrdnerZeigen1.ShowDialog = Windows.Forms.DialogResult.OK Then[/B]
            Dim TargetPfad As String = OrdnerZeigen1.SelectedPath
            TextBox2.Text = TargetPfad

        End If
    End Sub

    'Kopierroutine


    Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
        If TextBox1.Text <> Nothing And TextBox2.Text <> Nothing Then
            My.Computer.FileSystem.CopyDirectory(TextBox1.Text, TextBox2.Text, showUI:=FileIO.UIOption.AllDialogs)
        Else
            MessageBox.Show("Keinen Quell/Zielpfad angegeben")
        End If

    End Sub


    Private Sub Auswahl()
        Dim OrdnerZeigen As FolderBrowserDialog = New FolderBrowserDialog
        OrdnerZeigen.RootFolder = Environment.SpecialFolder.MyComputer

        If OrdnerZeigen.ShowDialog = Windows.Forms.DialogResult.OK Then
            Dim SourcePfad As String = OrdnerZeigen.SelectedPath
            TextBox1.Text = SourcePfad

            'Files Zählen

            Dim files As Integer = My.Computer.FileSystem.GetFiles(SourcePfad, FileIO.SearchOption.SearchAllSubDirectories, "*.*").Count 'das *.* zählt alle filetypen glaub ich
            Label3.Text = files

        End If
    End Sub



    Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
        Call Auswahl()
    End Sub
End Class
 
BackgroundWorker verwendet Threadpools, welche MTA (Multi Thread Apartment) sind.
Du musst also entweder wieder vom Main Thread (UI Thread) und mit dem Nachteil leben oder normales Threading verwenden und
Code:
SetApartmentState(ApartmentState.STA)
aufrufen (vor Aufruf des Threads)
 
Zuletzt bearbeitet:
Verstehe ich nicht. Aber auch wenn ich die Zeile SetApartmentState(ApartmentState.STA) irgendwo reinkopiere gibt es deklarierungsfehler, wo genau muss diese Zeile hin?

Und was bedeutet es was du geschrieben hast? das Multithreading nicht funktioniert?

Ich verstehe nicht was ist der Main Thread hier? Was ist der UI Thread?

Und wie kann ich das Problem lösen das das Fenster eine Zeit nicht reagiert?
 
Mit dem Background Worker kannst du keine OLE/COM-Calls machen, da diese aus STA-Threads erfolgen müssen. Dies unterstützt BGW jedoch nicht (weil er Threadpools verwendet = MTA).
Daher musst du auf das Threading per Namespace System.Threading; umsteigen und per o.g. Aufruf der Methode den ApartmentState auf STA setzen.
Der Main Thread ist in der Regel der GUI-Thread. Wenn du ein Programm ohne Multi-Threading erstellst, besteht das Programm aus einem Main-Thread

Zu Multithreading findest du über Google eine Menge How-Tos und Guides. Ans Herz lege ich dir aber Stackoverflow.com
Dort kannst findest du eigentlich auf jede Frage eine Antwort und kannst qualifizierte Fragen stellen
 
OK super danke, einigermaaßen verstanden,aber wie mache ich das nun? Wie baue ich deinen Befehl SetApartmentState(ApartmentState.STA) oder system.threading bei mir ein? Was wohl namespace ist..)

Der OLE/COm call ist der folderbrowserdialog?

Habe das hier versucht:

http://stackoverflow.com/questions/21295034/threadstateexception-error-on-openfiledialog

aber ich finde keine option startup objects in VB Express 2010, brauch ich visual studio?


Hier ein anderer Ansatz:

http://www.vbforums.com/showthread....eExeption-Error-STA-when-try-Backgroundworker

aber auch hier komme ich nicht weiter.
 
Zuletzt bearbeitet:
Zurück
Oben