elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Buscar Ingresar Registrarse
28 Mayo 2012, 05:16  


Tema destacado: Recuperar cuenta de Google, GMail, Youtube

+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (Moderador: [D4N93R])
| | | |-+  Descargar archivo sin que se frize el form
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Descargar archivo sin que se frize el form  (Leído 685 veces)
WHK
吴阿卡
Ex-Staff
*
Desconectado Desconectado

Mensajes: 4.113


The Hacktivism is not a crime


Ver Perfil WWW
Descargar archivo sin que se frize el form
« en: 4 Octubre 2011, 05:34 »

Siempre he hecho aplicaciones en .net descargando archivos pero ahora necesito si o si que no se me frize el form mientras se descarga algo.

Normalmente cuando ejecutas request.GetResponse() en un objeto WebRequest el form se congela y cuando finaliza la respuesta del servidor ahi recién se descongela.

Recuerdo hace años que en vb6 eso no pasaba, uno porque usabas control de usuarios para los sockets y todo era con subs en hilos de proceso y con inet tampoco se frizaba el form, simplemente la función no continuaba pero no comprometía el form.

Como lo hago en .net?

Por ahora hize un pequeño código:
Código
Imports System.IO
Imports System.Net
 
Public Class Form1
 
   Private Sub SalirToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SalirToolStripMenuItem.Click
       End
   End Sub
 
   Private Sub ConectarToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ConectarToolStripMenuItem.Click
       Timer1.Enabled = True
       Timer1.Start()
   End Sub
 
   Private Sub Process_data(ByVal Data As String)
       ' Constructor...
   End Sub
 
   Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
       Estado.Text = "Conectando ..."
       Application.DoEvents()
       ' Create a request for the URL.
       Dim request As WebRequest = WebRequest.Create("http://wordpress.org/latest.zip")
       ' If required by the server, set the credentials.
       request.Credentials = CredentialCache.DefaultCredentials
       ' Get the response.
       Dim response As HttpWebResponse = CType(request.GetResponse(), HttpWebResponse)
       ' Display the status.
       Console.WriteLine(response.StatusDescription)
       ' Get the stream containing content returned by the server.
       Dim dataStream As Stream = response.GetResponseStream()
       ' Open the stream using a StreamReader for easy access.
       Dim reader As New StreamReader(dataStream)
       ' Read the content.
       Dim responseFromServer As String = reader.ReadToEnd()
       ' Display the content.
       Dim Content As String = responseFromServer
       ' Cleanup the streams and the response.
       reader.Close()
       dataStream.Close()
       response.Close()
       Process_data(Content)
       Estado.Text = "Datos obtenidos"
   End Sub
 
   Private Sub DesconectarToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DesconectarToolStripMenuItem.Click
       Timer1.Enabled = False
       Timer1.Stop()
   End Sub
End Class

Realmente puse ese zip como ejemplo pero en la práctica será un chat y no quiero que rapte el form mientras descarga las actualizaciones cada 4 segundos de un xml.

También intenté con
Código
Response.GetResponseStream().Read(...
Me puse a leer de a 1024 bytes con un application.doevents() pero aun asi, igual se friza el form mientras hace las consultas.


« Última modificación: 4 Octubre 2011, 05:56 por WHK » En línea

Mi foro Ultra Off-Topics: http://whk.drawcoders.com/foro/

Gracias a todos! Good bye!
Novlucker
Ninja y
Ex-Staff
*
Desconectado Desconectado

Mensajes: 10.239


Yo que tu lo pienso dos veces


Ver Perfil
Re: Descargar archivo sin que se frize el form
« Respuesta #1 en: 4 Octubre 2011, 14:08 »

Si lo único que necesitas hacer es eso, lo más sencillo es utilizar un Thread para lanzar el proceso de descarga en background.
Ahora, si lo quieres hacer del modo "correcto" y mostrar entre otras cosas el estado de la descarga, lo mejor es utilizar el método BeginGetResponse y el objeto IAsyncResult

http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.begingetresponse.aspx

Saludos


En línea

Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD
http://twitter.com/novlucker

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

_katze_

Desconectado Desconectado

Mensajes: 99



Ver Perfil WWW
Re: Descargar archivo sin que se frize el form
« Respuesta #2 en: 4 Octubre 2011, 23:18 »

la respuesta de novlucker es buena! sino puedes cambiar por hacerlo con WebClient y  de manera asincronica, asi no se te frisara el form ni nada y tiene varios eventos los cuales puedes usar para obtener la descarga y para el porcentaje! suerte
En línea
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Powered by SMF 1.1.16 | SMF © 2006-2008, Simple Machines