elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  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 3,126 veces)
WHK
Moderador Global
***
Desconectado Desconectado

Mensajes: 6.605


Sin conocimiento no hay espíritu


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

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
  1. Imports System.IO
  2. Imports System.Net
  3.  
  4. Public Class Form1
  5.  
  6.    Private Sub SalirToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SalirToolStripMenuItem.Click
  7.        End
  8.    End Sub
  9.  
  10.    Private Sub ConectarToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ConectarToolStripMenuItem.Click
  11.        Timer1.Enabled = True
  12.        Timer1.Start()
  13.    End Sub
  14.  
  15.    Private Sub Process_data(ByVal Data As String)
  16.        ' Constructor...
  17.    End Sub
  18.  
  19.    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
  20.        Estado.Text = "Conectando ..."
  21.        Application.DoEvents()
  22.        ' Create a request for the URL.
  23.        Dim request As WebRequest = WebRequest.Create("http://wordpress.org/latest.zip")
  24.        ' If required by the server, set the credentials.
  25.        request.Credentials = CredentialCache.DefaultCredentials
  26.        ' Get the response.
  27.        Dim response As HttpWebResponse = CType(request.GetResponse(), HttpWebResponse)
  28.        ' Display the status.
  29.        Console.WriteLine(response.StatusDescription)
  30.        ' Get the stream containing content returned by the server.
  31.        Dim dataStream As Stream = response.GetResponseStream()
  32.        ' Open the stream using a StreamReader for easy access.
  33.        Dim reader As New StreamReader(dataStream)
  34.        ' Read the content.
  35.        Dim responseFromServer As String = reader.ReadToEnd()
  36.        ' Display the content.
  37.        Dim Content As String = responseFromServer
  38.        ' Cleanup the streams and the response.
  39.        reader.Close()
  40.        dataStream.Close()
  41.        response.Close()
  42.        Process_data(Content)
  43.        Estado.Text = "Datos obtenidos"
  44.    End Sub
  45.  
  46.    Private Sub DesconectarToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DesconectarToolStripMenuItem.Click
  47.        Timer1.Enabled = False
  48.        Timer1.Stop()
  49.    End Sub
  50. 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
  1. 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 am por WHK » En línea

Novlucker
Ninja y
Colaborador
***
Desconectado Desconectado

Mensajes: 10.683

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 pm »

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
"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein
_katze_

Desconectado Desconectado

Mensajes: 140



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

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:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Descargar archivo FTP con un BAT
Scripting
kicking people 4 17,970 Último mensaje 12 Enero 2009, 16:28 pm
por yercodl
Quisiera saber como.. agrego un archivo .exe a mi Form
Programación Visual Basic
terrorista 5 2,932 Último mensaje 5 Agosto 2010, 19:29 pm
por Riki_89D
Obtener Ruta de archivo arrastrado a un Form (Drag & Drop)
.NET (C#, VB.NET, ASP)
adan-2994 2 5,872 Último mensaje 7 Agosto 2011, 19:18 pm
por adan-2994
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines