none
Descargas simultaneas con WebClient C# RRS feed

  • Pregunta

  • Hola estoy desarrollando un descargador de música, hasta ahora descarga de a un archivo utilizando el webClient, queria saber si es posible descargar archivos simultáneamente según el usuario elija la canción.

    Esto es el código para descargar de a una canción...

    Uri realLink = new Uri(link);
    WebClient wc = new WebClient();
    wc.DownloadFileAsync(realLink,urlParte2 + ".mp3");


    Elias Molla


    viernes, 31 de agosto de 2018 12:30

Respuestas

  • De hecho, el metodo que estas llamando (DownloadFileAsync) se siempre asincrono, usando el ThreadPool. Esto significa que no es bloqueante, es decir, se pone a descargar el fichero y no se detiene, sino que pasa a ejecutar las siguientes lineas de programa mientras el fichero se esta descargando. Por lo tanto, si vuelves a llamar al DownloadFileAsync pasandole otra URL, se pone a realizar esta segunda descarga en paralelo automaticamente.

    En resumidas cuentas, no tienes que hacer nada. Si ese codigo que has mostrado lo tienes en el Click de ElegirCancion, se pondra a descargar simultaneamente todas las canciones en las que el usuario haga click. Ojo, puedes tener limitaciones fuera del programa, bien sea en Windows o en el servidor de ficheros, que establezcan un determinado numero maximo de descargas simultaneas.

    viernes, 31 de agosto de 2018 13:00
  • Puedes usar el evento DownloadProgressChanged del WebClient:

    https://docs.microsoft.com/en-us/dotnet/api/system.net.webclient.downloadprogresschanged?view=netframework-4.7.2

    El ejemplo de la documentacion lo que hace es escribir el texto "Descargado {1} de {2} bytes. {3} % complete". En tu caso, en lugar de escribirlos en un string, usarias esos mismos datos para cambiar la posicion del scrollbar.

    Si tienes varias descargas a la vez, usando cada una un WebClient distinto (el "new" que tienes en tu codigo), puedes conectar el mismo manejador de eventos a todos los WebClients. En ese caso, el "sender" te dira cual de los WebClients ha disparado el evento, y puedes usar esa informacion para determinar cual de los progressbars hay que actualizar.

    Recuerda que el DownloadFileAsync usa un Thread del ThreadPool, y dispara el evento dentro del Thread. Por lo tanto, antes de actualizar el ProgressBar tienes que aplicar las precauciones habituales que se usan cuando se actualiza la interfaz de usuario en aplicaciones multihilo (es decir, usar el Invoke o BeginInvoke del Control si es una aplicacion WinForms). De lo contrario te saldra el clasico error de "llamada ilegal entre hilos".

    viernes, 31 de agosto de 2018 14:27

Todas las respuestas

  • De hecho, el metodo que estas llamando (DownloadFileAsync) se siempre asincrono, usando el ThreadPool. Esto significa que no es bloqueante, es decir, se pone a descargar el fichero y no se detiene, sino que pasa a ejecutar las siguientes lineas de programa mientras el fichero se esta descargando. Por lo tanto, si vuelves a llamar al DownloadFileAsync pasandole otra URL, se pone a realizar esta segunda descarga en paralelo automaticamente.

    En resumidas cuentas, no tienes que hacer nada. Si ese codigo que has mostrado lo tienes en el Click de ElegirCancion, se pondra a descargar simultaneamente todas las canciones en las que el usuario haga click. Ojo, puedes tener limitaciones fuera del programa, bien sea en Windows o en el servidor de ficheros, que establezcan un determinado numero maximo de descargas simultaneas.

    viernes, 31 de agosto de 2018 13:00
  • Me acabo de dar cuenta, que idiota jajaja.

    Bien, ahora como podría hacer para que cada descarga tenga su propio progress bar..


    Elias Molla

    viernes, 31 de agosto de 2018 13:13
  • Puedes usar el evento DownloadProgressChanged del WebClient:

    https://docs.microsoft.com/en-us/dotnet/api/system.net.webclient.downloadprogresschanged?view=netframework-4.7.2

    El ejemplo de la documentacion lo que hace es escribir el texto "Descargado {1} de {2} bytes. {3} % complete". En tu caso, en lugar de escribirlos en un string, usarias esos mismos datos para cambiar la posicion del scrollbar.

    Si tienes varias descargas a la vez, usando cada una un WebClient distinto (el "new" que tienes en tu codigo), puedes conectar el mismo manejador de eventos a todos los WebClients. En ese caso, el "sender" te dira cual de los WebClients ha disparado el evento, y puedes usar esa informacion para determinar cual de los progressbars hay que actualizar.

    Recuerda que el DownloadFileAsync usa un Thread del ThreadPool, y dispara el evento dentro del Thread. Por lo tanto, antes de actualizar el ProgressBar tienes que aplicar las precauciones habituales que se usan cuando se actualiza la interfaz de usuario en aplicaciones multihilo (es decir, usar el Invoke o BeginInvoke del Control si es una aplicacion WinForms). De lo contrario te saldra el clasico error de "llamada ilegal entre hilos".

    viernes, 31 de agosto de 2018 14:27
  • No entiendo bien, esto es lo que hago

                    wc.DownloadProgressChanged += new DownloadProgressChangedEventHandler(cargando);
                    wc.DownloadFileCompleted += new AsyncCompletedEventHandler(descargado);

    Pero necesito separar cada porcentaje de descarga en caso de que el usuario quiera realizar mas descargas simultaneas, si es posible una guía, o que debo aprender a usar por favor..


    Elias Molla

    viernes, 31 de agosto de 2018 23:22
  • esto es lo que hago

    wc.DownloadProgressChanged += new DownloadProgressChangedEventHandler(cargando);
    
    No basta con hacer eso. Además tendrás que escribir la subrutina DownloadProgressChangedEventHandler. Dentro de esa subrutina es donde te llegan los datos suficientes para saber cuál es el porcentaje descargado (fíjate bien en el ejemplo que viene en la documentación, que te muestra cómo sacar esos datos).
    sábado, 1 de septiembre de 2018 8:39