Usuário com melhor resposta
Atualizar interface gráfica de outra Thread

Pergunta
-
Bom dia pessoal,
Estou tentando atualizar a interface gráfica através de uma outra Thread (que não é a principal), e a seguinte exception é disparada:
An unhandled exception of type 'System.InvalidOperationException' occurred in WindowsBase.dll
Additional information: The calling thread cannot access this object because a different thread owns it.Como posso resolver isso? Alguém tem algum exemplo?
Atualmente meu código está dessa forma:
public MainWindow()
{
InitializeComponent();Thread minhaThread = new Thread(new ThreadStart(ExecutaThread));
minhaThread.Start();
}private void ExecutaThread()
{
this.txtMsg.Text = "..."; // <---- A Exception é dispada aqui!!
while(true)
{
Console.WriteLine("run...");
}
}Agradeço a atenção de todos.
Um abraço,
Ewerton.
Respostas
-
Olá Ewerton,
Use o Dispatcher para atualizar o elemento UI. Segue um exemplo
this.Dispatcher.BeginInvoke((UpdateUI)delegate { this.txt.Text = "Text"; }, null);
declare um delegate para dar o cast no BeginInvoke
Att.private delegate void UpdateUI();
Anderson
- Sugerido como Resposta Ari C. RaimundoModerator sexta-feira, 17 de setembro de 2010 03:11
- Marcado como Resposta AndreAlvesLimaModerator terça-feira, 5 de outubro de 2010 01:34
-
Ewerton,
Só complementando a resposta do Anderson, não é necessário definir o delegate. É possível utilizar uma Action com uma expressão lambda. Por exemplo..
Dispatcher.BeginInvoke(new Action( () =>
{
this.seuTextBox.Text = "Seu texto aqui...";
}
));
Att.
Ari C. Raimundo
MCAD, MCTS
http://araimundo.blogspot.com- Marcado como Resposta AndreAlvesLimaModerator terça-feira, 5 de outubro de 2010 01:34
Todas as Respostas
-
Olá Ewerton,
Use o Dispatcher para atualizar o elemento UI. Segue um exemplo
this.Dispatcher.BeginInvoke((UpdateUI)delegate { this.txt.Text = "Text"; }, null);
declare um delegate para dar o cast no BeginInvoke
Att.private delegate void UpdateUI();
Anderson
- Sugerido como Resposta Ari C. RaimundoModerator sexta-feira, 17 de setembro de 2010 03:11
- Marcado como Resposta AndreAlvesLimaModerator terça-feira, 5 de outubro de 2010 01:34
-
Ewerton,
Só complementando a resposta do Anderson, não é necessário definir o delegate. É possível utilizar uma Action com uma expressão lambda. Por exemplo..
Dispatcher.BeginInvoke(new Action( () =>
{
this.seuTextBox.Text = "Seu texto aqui...";
}
));
Att.
Ari C. Raimundo
MCAD, MCTS
http://araimundo.blogspot.com- Marcado como Resposta AndreAlvesLimaModerator terça-feira, 5 de outubro de 2010 01:34