Alguma solução para a exceção de operação ilegal de thread cruzado?

StackOverflow https://stackoverflow.com/questions/1994

  •  08-06-2019
  •  | 
  •  

Pergunta

Quando você vincula dados em C#, o thread que altera os dados faz com que o controle também mude.Mas se esse thread não for aquele no qual o controle foi criado, você receberá uma exceção Illegal Cross Thread Operation.

Existe alguma maneira de evitar isso?

Nenhuma solução correta

Outras dicas

Você deve ser capaz de fazer algo como:

if (control.InvokeRequired)
{
    control.Invoke(delegateWithMyCode);
}
else
{
    delegateWithMyCode();
}

InvokeRequired é uma propriedade em Controls para ver se você está no thread correto, então Invoke invocará o delegado no thread correto.

ATUALIZAR:Na verdade, no meu último trabalho fizemos algo assim:

private void SomeEventHandler(Object someParam)
{
    if (this.InvokeRequired)
    {
        this.Invoke(new SomeEventHandlerDelegate(SomeEventHandler), someParam);
    }

    // Regular handling code
}

o que elimina a necessidade do bloco else e torna o código mais rígido.

Como não tenho um caso de teste para partir, não posso garantir esta solução, mas me parece que um cenário semelhante ao usado para atualizar barras de progresso em diferentes threads (use um delegado) seria adequado aqui.

public delegate void DataBindDelegate();
public DataBindDelegate BindData = new DataBindDelegate(DoDataBind);

public void DoDataBind()
{
    DataBind();
}

Se a ligação de dados precisar ser feita por um thread específico, deixe esse thread fazer o trabalho!

Se a chamada do thread for "ilegal" (ou seja,a chamada do DataBind afeta controles que não foram criados no thread de onde está sendo chamado), então você precisa criar um delegado para que, mesmo que a decisão/preparação para o DataBind não seja feita no thread de criação do controle, qualquer modificação resultante do eles (ou seja,DataBind()) será.

Você chamaria meu código do thread de trabalho assim:

this.BindData.Invoke();

Isso faria com que o thread original fizesse a ligação, o que (presumindo que seja o thread que criou os controles) deveria funcionar.

No WPF e no Silverlight, a infraestrutura de ligação cuida da mudança para o thread da UI.

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