Skip Navigation Links
Novas Tecnologias
Ferramentas Adicionais
Ferramentas Adicionais


Dica No :
616
Assunto : WebServices
Titulo: Truques com chamadas assincronas de WebServices

Gostou do texto ? Vote e dê sua opinião! Pontuação atual :

Translate this page now :






Adicione aos Favoritos!
BlogBlogs Rec6 Linkk Ueba Technorati Delicious DiggIt! StumbleUpon



É muito comum utilizarmos métodos em webServices devolvendo dataSets para o client e exibirmos tais dataSets em datagrids de windows applications.

Também não é raro que devido a condições de rede e dos servidores que o webService tenha uma certa demora em sua chamada, e por isso é comum utilizarmos uma chamada assíncrona. Com uma chamada assíncrona permitimos que o usuário continue a trabalhar enquanto aguarda a resposta do serviço. Veja como fica o código de chamada assincrona neste exemplo :



dim callback as new AssyncCallback(addressof terminou)

Sub Form_Load()
dim obj as new servico.Classe
obj.BeginLerDados(callback,obj)
End Sub

Sub terminou(fim as IasyncState)
dim obj as servico.Classe
obj=fim.assyncState
datagrid1.datasource=obj.endlerdados(fim)
End Sub


O problema é que da forma como está esse exemplo não funcionará. O fato de estarmos manipulando o datasource da grid dentro da sub terminou, que é chamada de forma assincrona, irá travar a aplicação.

Isso porque uma chamada assincrona usa threads diferentes para ser executada. Assim sendo a sub terminou roda em uma thread diferente do form_load. Isso a principio não seria grande problema, mas o método endListarDados, de finalização da chamada assíncrona, prepara-se para eliminar a thread.

Quando fazemos a atribuição ao datasource da grid a grid realiza um grande processamento para realizar seu preenchimento. Porém, como a thread está se encerrando, temos ai um conflito e a aplicação trava.

Para contornarmos isso devemos preencher a grid em um thread a parte. Veja como fica :



dim callback as new AssyncCallback(addressof terminou)
Dim ds as DataSet

Sub Form_Load()

dim obj as new servico.Classe

obj.BeginLerDados(callback,obj)

End Sub


Sub terminou(fim as IasyncState)

dim obj as servico.Classe
Dim th as new Threading.Thread(addressof vinculargrid)

obj=fim.assyncState

ds=obj.endlerdados(fim)

th.start

End Sub

Sub VincularGrid

datagrid1.datasource=ds

End Sub

Desta forma o vínculo da grid consegue ser processado sem travar a aplicação.


Nome :
E-mail:
Comentarios :
 
 
Os Últimos Comentários
Nenhum comentário foi realizado ainda. Seja o primeiro !
Dicas
Dica do Dia
Receba Dicas Por Email
E-mail :  
 


 (help)
Aceito receber informativos do devASPNet, informações de eventos e treinamentos

Veja Quais Informativos Você Receberá

Pesquisar Dicas
Pesquisar Artigos, Dicas e Noticias

Banco de Dados
Algumas Entrevistas
Links Importantes

Búfalo Informática, Treinamento e Consultoria
R. Alvaro Alvim, 37/920 Centro - Cinelândia - Rio de Janeiro Cep: 20031-010
Tel : (21) 2262-1368 (21) 9240-5134 E-mail : Contato@bufaloinfo.com.br