Forum: PC-Programmierung VB - ShowDialog - Threadübergreifend close


von Thomas F. (Gast)


Lesenswert?

Guten Abend there ^^

ich stehe vor einem Problem womit ich mich bereits mehrere Abende mit 
beschäftigt habe. Die vielen MSDN-Seiten und Links in der Suchmaschine 
ergaben auch keine Erfolge.

Es geht um ein Dialogfenster das als ShowDialog angezeigt wird. Dieser 
wiederum öffnet einen seriellen Port und erzeugt das dazugehörige 
EventHandler zum empfangen der Daten. Daten werden empfangen, alles gut. 
Nach dem Empfangen der Daten möchte ich den Port schließen und das 
Dialogfenster schließen. Beim Versuch des Schließens vom Dialogfenster 
erfolgt der Laufzeitfehler:
1
System.ObjectDisposedException: "Auf das verworfene Objekt kann nicht zugegriffen werden.
2
Objektname: "Dialog2"."

Mir ist klar dass dies ein threadübergreifender Fehler 
höchstwahrscheinlich ist. Habe bereits vieles versucht. Habe Invokes 
benutzt und was das I-Net noch zu bieten hatte. Schaut ma bitte drüber. 
LG Thomas
1
Public Class Dialog2
2
3
    Dim mySerialPort As New SerialPort("COM6")    
4
5
    Private Sub Cancel_Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Cancel_Button.Click
6
        Me.DialogResult = System.Windows.Forms.DialogResult.Cancel
7
        CloseMe()
8
    End Sub
9
10
    Private Sub Dialog2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
11
        Serial_Port()
12
        mySerialPort.Open()
13
    End Sub
14
15
    Private Sub Dialog2_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing
16
        mySerialPort.Close()        
17
    End Sub    
18
19
    Private Sub CloseMe()
20
        If Me.InvokeRequired Then
21
            Me.Invoke(New Action(AddressOf Me.Close))
22
            Exit Sub
23
        End If
24
        Me.Close()
25
    End Sub
26
27
    Public Sub Serial_Port()
28
        mySerialPort.BaudRate = 9600
29
        mySerialPort.Parity = Parity.None
30
        mySerialPort.StopBits = StopBits.One
31
        mySerialPort.DataBits = 8
32
        mySerialPort.Handshake = Handshake.None
33
        mySerialPort.RtsEnable = True
34
        mySerialPort.NewLine = vbCr
35
36
        AddHandler mySerialPort.DataReceived, AddressOf DataReceivedHandler
37
38
    End Sub
39
40
41
    Public Sub DataReceivedHandler(sender As Object, e As SerialDataReceivedEventArgs)
42
        Dim sp As SerialPort = CType(sender, SerialPort)
43
        PubVar.RFID_Data = sp.ReadLine 'PubVar ist ein Modul die die String-Variable RFID_Data enthält      
44
        Me.DialogResult = System.Windows.Forms.DialogResult.OK
45
        If PubVar.RFID_Data IsNot Nothing Then
46
            Me.mySerialPort.Close()
47
            Me.CloseMe()
48
        End If
49
    End Sub
50
51
End Class

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Schicke dem Dialog eine WM_CLOSE-Nachricht, statt die Close-Funktion aus 
Deinem anderen Thread aufzurufen.

von Thomas F. (Gast)


Lesenswert?

Danke für den Tipp.
Vielen Dank.

LG
Thomas

von bluppdidupp (Gast)


Lesenswert?

Ein Close() auf ein Form-Objekt macht intern (falls die Form bereits ein 
Handle hat):
SendMessage(NativeMethods.WM_CLOSE, 0, 0);

Wo wird denn das System.ObjectDisposedException geworfen und wie sieht 
der Stacktrace aus?
Vermutlich wird das Close() auch ausgeführt und Dialog2 gekillt, aber 
irgendwas versucht nach dem killen noch auf Dialog2 zuzugreifen.
Was das ist könnte am Stacktrace erkennbar sein.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.