Webly: Executando Crossthread Sem Erro - Webly

Ir para

Regras para postagem

É permitido postar livremente respostas com comentários, testes e avaliações dos scripts. Postagens contendo dúvidas sobre o script, deverão ser postadas no fórum principal de .NET.

IMPORTANTE: Todos os tutoriais postados neste fórum irão automaticamente para o portal Webly. Contribua você também e faça parte da equipe de colaboradores que fazem a evolução da web. Obrigado.
Página 1 de 1

Executando Crossthread Sem Erro Avaliar tópico: ***** 1 Votos

#1 Membro offline   Ricardo M Machado Ícone

  • Ícone
  • Grupo: Membro Amigo
  • Posts: 293
  • Cadastrado: 12-julho 06
  • Localização:Porto Velho / RO

Postou 13 junho 2007 - 12:32

Olá pessoal,

Mais um pequeno tutorial, este praticado com visual c# express. Cross Thread ocorre quando aplicamos uma nova Thread em nossa aplicação e neste precisamos trabalhar com componentes do nosso form como textbox.

Exemplo:

// Criação da variável
Thread pross;

private
void Form1_Load(object sender, EventArgs e)
{
// Instância a variável
pross =
new Thread(Work);
// Define para trabalhar em background
pross.IsBackground =
true;
pross.Start();
}

private void Work()
{
MostraDados();
}

private
void MostraDados()
{

textBox1.Text = "primeiro box";
textBox2.Text =
"segundo box";
textBox3.Text =
"terceiro box";

}

Neste exemplo, um erro é mostrado:

InvalidOperationException was unhandle:
Cross-thread operation not valid: Control 'textBox1' accessed from a thread other than the thread it was created on.


Informando que o componente textBox1, não pertence a Thread em questão, por este motivo não é possível manipular sua propriedade, para isto você deve utilizar a Thread que o criou.


Solução:

Assim devemos então criar um delegate na Thread original e utilizar o método Invoke dos componentes para manipularmos.

Exemplo:


// Criação da variável
Thread
pross;
// Criação do Delegate na Thread original
delegate void Worker(TextBox textBox, string Texto);

private void Work()
{
MostraDados();
}

private void MostraDados()
{

if (textBox1.InvokeRequired)
{

Worker worker = new Worker(this.Preenche);
textBox1.Invoke(worker, textBox1,
"primeiro box");

}

if (textBox2.InvokeRequired)
{

Worker worker = new Worker(this.Preenche);
textBox2.Invoke(worker, textBox2,
"segundo textbox, esse com mais texto");

}

if (textBox3.InvokeRequired)
{

Worker worker = new Worker(this.Preenche);
textBox3.Invoke(worker, textBox3,
"terceito textbox, fazendo mais testes");

}
}

private void Preenche(TextBox textBox, string Texto)
{
textBox.Text = Texto;
}

private void Form1_Load(object sender, EventArgs e)
{
// Instância a variável
pross =
new Thread(Work);
// Define para trabalhar em background
pross.IsBackground =
true
;
pross.Start();
}



Isto é só por enquanto pessoal, qualquer dúvida, crítica ou sugestões por favor façam.
Até a próxima.



[img]http://www.mesaberta.com.br/mcts.png[/img]

contato: [email="ricardo_machado@hotmail.com"]ricardo_machado@hotmail.com[/email]
0

Página 1 de 1


Resposta rápida

  

1 usuário(s) está(ão) lendo este tópico
0 membro(s), 1 visitante(s) e 0 membros anônimo(s)