Jump to content
caewilliam

WebRequest Trava Janela do Aplicativo, enquanto fas solicitação.

Recommended Posts

caewilliam

Bom dia galera.

Estou com um problema  no meu aplicativo. Bom estou usando WebRequest para pegar uns dados da web.

Estou usando o seguinte código.

string html = new System.IO.StreamReader(WebRequest.Create("http://www.google.com.br/").GetResponse().GetResponseStream()).ReadToEnd();

para pegar uns dados da web.

O script funciona perfeitamente, o problema é que, a janela do Aplicativo trava enquanto ta pegando os dados, e destrava depois de pegar o html do site.

Gostaria de saber se alguém sabe como faço para isso não acontecer, pois pretendo colocar uma mensagem de tipo. "Carregando...", ou uma imagem de Loading, enquando ta fazendo a solicitação.

Um amigo meu falou que eu teria que usar Thread, mais ele não me falou como fazer, como não sou muito bom em C# eu não consequi fazer funcionar pelo Thread, eu pesquisei no google mais não encontrei solução.

Obrigado!

Share this post


Link to post
Share on other sites
Tiago Salgado

Adicionas por exemplo ao evento Click de um botão,:

Thread t = new Thread(new ThreadStart(a_tua_funcao));
t.IsBackground = true;
t.Start();

Depois a tua função "a_tua_funcao" terá o teu código para fazeres o WebRequest:

private void a_tua_funcao()
{
...
string html = new System.IO.StreamReader(WebRequest.Create("http://www.google.com.br/").GetResponse().GetResponseStream()).ReadToEnd();
...
}

Share this post


Link to post
Share on other sites
daj

É o que está dito na mensagem de erro: não podes afectar as propriedades do form com outra thread que não a que está associada ao form (que é a thread em que o form foi criado). Vê a documentação do método Invoke() para executar código na UI thread:

http://msdn.microsoft.com/en-us/library/zyzhdc6b.aspx

Tens também mais alguma informação sobre isso aqui:

http://www.yoda.arachsys.com/csharp/threads/winforms.shtml

Neste exemplo repara na última linha do método ThreadJob() (método este que é executado numa thread criada no StartThread()):

void ThreadJob() {
   // ...
   Invoke (new MethodInvoker(EnableButton));
}

void EnableButton() {
   button.Enabled = true;
}

O botão não é activado nessa thread mas é delegada, através do Invoke(), essa tarefa para a UI thread.

Já agora, sugiro-te também que vejas o BackgroundWorker. Tens um exemplo em:

http://msdn.microsoft.com/en-us/library/hybbz6ke(v=VS.100).aspx

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.