none
Como chamar a função Me.Dispose dentro de uma Thread? RRS feed

  • Pergunta

  • Ao executar o código abaixo em uma nova Thread ele me retorna o seguinte erro: "Operação entre threads inválida: controle 'FormDialogoEdição' acessado de um thread que não é aquele no qual foi criado."

     Private Sub IniciarProcesso()
    
            Do 'Loop realizado enquanto o processo estiver aberto
    
                If Not proc.HasExited Then
    
                    'Atualiza as propriedades do processo
                    proc.Refresh()
    
                End If
            Loop While Not proc.WaitForExit(1)
    
            Me.Dispose()
    
    End Sub

    Como resolver isso?

    sábado, 17 de junho de 2017 18:29

Respostas

  • Consegui da seguinte forma:

    Imports System.Threading

    Public Class FormDialogoEdição
        'Declaração do Delegate
        Public Delegate Sub Fechar()

        Public CaminhoImagem As String
        Public CaminhoPrograma As String
        Private td As Thread
        Private proc As New Process

        Private Sub FormDialogoEdição_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            proc.StartInfo.Arguments = CaminhoImagem
            proc.StartInfo.FileName = CaminhoPrograma
            proc.Start()

            ProcessoNome.Text = proc.ProcessName
            ProcessoInício.Text = proc.StartTime.ToLongTimeString

            td = New Thread(New ThreadStart(AddressOf IniciarProcesso))
            td.IsBackground = True
            td.Start()
        End Sub

        Private Sub IniciarProcesso()

            Do 'Loop realizado enquanto o processo estiver aberto

                If Not proc.HasExited Then

                    'Atualiza as propriedades do processo
                    proc.Refresh()

                End If
            Loop While Not proc.WaitForExit(1)

            If Me.InvokeRequired = True Then
                'Intância do Delegado
                Dim DelegateFecha As New Fechar(AddressOf Me.Dispose)

                'Invoca o delegado
                Me.Invoke(DelegateFecha)
            Else
                Me.Dispose()
            End If

        End Sub

    End Class



    • Marcado como Resposta EricJhon92 sábado, 17 de junho de 2017 19:25
    • Editado EricJhon92 sábado, 17 de junho de 2017 19:27
    sábado, 17 de junho de 2017 19:25