Executando Crossthread Sem Erro
Executando crossthread sem erro
Escrito por Ricardo M Machado em
.Net. Data: 13/06/2007
Licença: Alguns direitos reservados. Dar créditos ao autor e linkar este original
Ver tópico original no fórum.
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.