none
Atualizar interface gráfica de outra Thread RRS feed

  • 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.

    quinta-feira, 16 de setembro de 2010 12:44

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

    private delegate void UpdateUI();
    
    Att.
    Anderson

    quinta-feira, 16 de setembro de 2010 14:00
  • 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

    sexta-feira, 17 de setembro de 2010 03:22
    Moderador

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

    private delegate void UpdateUI();
    
    Att.
    Anderson

    quinta-feira, 16 de setembro de 2010 14:00
  • 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

    sexta-feira, 17 de setembro de 2010 03:22
    Moderador