Qualquer solução para Cruz ilegal exceção da linha Operação?

votos
15

Quando você vincular dados em C #, o thread que altera os dados faz com que o controle para mudar também. Mas se esta discussão não é aquele em que o controle foi criado, você receberá uma exceção Operação ilegal Cruz Thread.

Existe uma maneira de evitar isso?

Publicado 05/08/2008 em 08:45
fonte usuário
Em outras línguas...                            


5 respostas

votos
3

Se a modificação de dados não é muito demorado (o que significa que, se o objetivo principal da discussão de fundo não é a modificação de dados reais), tente mover a seção que modifica os dados para um delegado e Invoke'ing esse delegado.

Se o trabalho pesado real é sobre os dados, você provavelmente terá que criar uma cópia profunda desses dados para passar para a discussão de fundo, que irá enviar os dados processados ​​volta para o segmento UI via Invoke novamente.

Você só terá de mover o código que muda os dados para a função de delegado (porque a alteração de dados é o que desencadeia a atualização controle). Fora isso, você não deve ter que escrever qualquer coisa extra.

Respondeu 05/08/2008 em 09:05
fonte usuário

votos
3

Você deve ser capaz de fazer algo como:

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

InvokeRequired é uma propriedade em controles para ver se você está na linha correta, então Invoke irá chamar o delegado no thread correto.

UPDATE: Na verdade, no meu último trabalho que fizemos algo como isto:

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

    // Regular handling code
}

que elimina a necessidade para o bloco mais e tipo de aperta-se o código.

Respondeu 05/08/2008 em 08:51
fonte usuário

votos
1

Como eu não tenho um caso de teste para ir de eu não posso garantir esta solução, mas parece-me que um cenário semelhante ao utilizado para atualizar barras de progresso em diferentes tópicos (usar um delegado) seria adequado aqui.

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

public void DoDataBind()
{
    DataBind();
}

Se os dados necessidades vinculativo a ser feito por um segmento específico, em seguida, deixar que o fio fazer o trabalho!

Respondeu 05/08/2008 em 08:56
fonte usuário

votos
0

Em WPF e Silverlight a infra-estrutura de ligação cuida da comutação para o segmento de interface do usuário.

Respondeu 08/08/2008 em 17:19
fonte usuário

votos
0

Se a chamada linha é "ilegal" (ou seja, a chamada DataBind afeta os controles que não foram criados no thread que está sendo chamado de) então você precisa criar um delegado de modo que mesmo se a decisão / preparação para o DataBind não é feito em o fio de criação de controlo, qualquer modificação resultante delas (ou seja, DataBind ()) será.

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

this.BindData.Invoke();

Este seria, então fazer com que o segmento original para fazer a ligação, o que (presumindo que é o segmento que criou os controles) deve funcionar.

Respondeu 05/08/2008 em 09:06
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more