none
RPC_E_WRONG_THREAD ao setar propriedade de controle em aplicação Metro RRS feed

  • Pergunta

  • Estou com o seguinte problema em uma aplicação Metro com o Visual Studio 11 Express Beta for Windows 8.

    Tenho uma página xaml (UserInfo) na qual faço uma requisição assíncrona a uma url do twitter. No método Responde_Completed eu recebo o retorno dessa requisição sem problemas. A questão é que eu não consigo acessar os controles da página. Quando tento setar qualquer propriedade do TextBlock tbPersonName como a ".Text" eu recebo o seguinte erro: The application called an interface that was marshalled for a different thread. (Exception from HRESULT: 0x8001010E (RPC_E_WRONG_THREAD))

    Alguém tem alguma sugestão?

            public UserInfo()
            {
                this.InitializeComponent();

                string url = "https://api.twitter.com/1/users/show.xml?screen_name=brambillator&include_entities=true";

                HttpWebRequest httpWebRequest = (HttpWebRequest)HttpWebRequest.Create(url);
                httpWebRequest.Method = "GET";

                httpWebRequest.BeginGetResponse(Response_Completed, httpWebRequest);

            }
           
            void Response_Completed(IAsyncResult result)
            {

                tbPersonName.Text = "Test string";

            ....

             }

    • Tipo Alterado C. Augusto Proiete [MVP]Moderator quinta-feira, 19 de abril de 2012 23:24 Trata-se de uma pergunta...
    • Movido C. Augusto Proiete [MVP]Moderator sexta-feira, 20 de abril de 2012 00:06 Movido para o fórum mais apropriado possível (já que ainda não temos um fórum para Metro Style Apps) (De:.NET Development - Geral)
    domingo, 8 de abril de 2012 21:18

Todas as Respostas

  • Olá Rodrigo,

    Isso acontece porque o método Response_Completed é executado em uma thread diferente da thread da interface gráfica e não é permitido acessar controles de uma thread diferente.

    Para conseguir alterar os controles a partir daí, você teria de chamar o Dispatcher e passar uma função (ou lambda expression) para ser executada pelo Dispatcher, na thread correta. Isso não é uma característica das aplicações Metro, mas de qualquer aplicação Windows, seja Windows Forms ou WPF...

    No entanto, no .NET Framework 4.5 (incluido no Windows 8) as chamadas assíncronas são muito mais simples utilizando async e await, e o WinRT fornece a classe HttpClient, específica para efetuar requisições e preparada para utilizar o padrão assíncrono com Tasks (que são awaitable).

    private async void ObterTweets_Click(...)
    {
    	const string url = "https://api.twitter.com/..."
    
    	var client = new HttpClient();
    	var response = await client.GetAsync(new Uri(url));
    	var content = await response.Content.ReadAsStringAsync();
    
    	//...
    	
    	tbPersonName.Text = "Test string";
    }

    Abraços,
    Caio Proiete



    Caio Proiete
    Microsoft MVP, MCT, MCPD, MCTS, MCSD
    http://caioproiete.net
    sexta-feira, 20 de abril de 2012 00:01
    Moderador