Pergunta

Se estiver configurando a propriedade de texto de um formulário de um thread não UI, preciso usar o Invoke para evitar um erro de thread cruzado. Mas, posso ler a propriedade de texto sem usar o Invoke. Isso é seguro? Se eu tentar ler a propriedade Handle de um formulário, recebo um erro de threading cruzado. Se eu leu a propriedade ISDispose de um formulário, ele funciona bem. Como posso saber quando preciso usar o Invoke? Eu devo sempre estar usando o Invoke para ler e escrever valores de propriedades?

Foi útil?

Solução

Sempre que você estiver em um tópico, outro a partir do tópico da interface do usuário, você deve usar Invoke Ao acessar objetos da interface do usuário. Usar InvokeRequired Propriedade para descobrir se você está de fato, em um encadeamento diferente.

Outras dicas

A maneira mais fácil é usar:

Delegate Sub SetTextCallback(ByVal [text] As String)

Private Sub SetText(ByVal [text] As String)
' InvokeRequired required compares the thread ID of the
' calling thread to the thread ID of the creating thread.
' If these threads are different, it returns true.
If Me.lboxResults.InvokeRequired Then
    Dim d As New SetTextCallback(AddressOf SetText)
    Me.Invoke(d, New Object() {[text]})
Else
    Me.lboxResults.Items.Add([text])
End If

Final sub

Desculpe pelo código VB ...

Outra opção é usar o SynchronizationContext. Isso funcionaria não apenas para WinForms, mas também para WPF e ASP.NET, e está disponível desde o .NET 2.0.

Call SynchronizationContext.Current no encadeamento principal (por exemplo, no construtor) e use o objeto retornado sempre que precisar sincronizar as chamadas. Se o objeto for nulo, você não precisará de sincronização.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top