VB - ShowDialog - Threadübergreifend close

Gast #5497259
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
Gast #5509996
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren