Définition de l'état de l'utilisateur lors du téléchargement asynchrone

StackOverflow https://stackoverflow.com/questions/1216252

  •  06-07-2019
  •  | 
  •  

Question

VS 2008 SP1

J'utilise le clic Web pour télécharger des fichiers de manière asynchrone.

J'ai 5 fichiers à télécharger.

Cependant, je souhaite surveiller chaque téléchargement et définir l'état de l'utilisateur en tant que nom du fichier. Ainsi, dans ProgressCompletedEvent, je peux vérifier l'état de l'utilisateur pour savoir quel fichier s'est terminé?

C’est un extrait de code de ce que j’essaie de faire.

// This function will be called for each file that is going to be downloaded.
// is there a way I can set the user state so I know that the download 
// has been completed 
// for that file, in the DownloadFileCompleted Event? 
private void DownloadSingleFile()
{
    if (!wb.IsBusy)
    {        
        //  Set user state here       
        wb.DownloadFileAsync(new Uri(downloadUrl), installationPath);
    }
}


void wb_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
{
    Console.WriteLine("File userstate: [ " + e.UserState + " ]");   
}

void wb_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{
    Console.WriteLine("File userstate: [ " + e.UserState + " ]");   

    double bytesIn = double.Parse(e.BytesReceived.ToString());
    double totalBytes = double.Parse(e.TotalBytesToReceive.ToString());
    double percentage = bytesIn / totalBytes * 100;

    progressBar1.Value = int.Parse(Math.Truncate(percentage).ToString());

}
Était-ce utile?

La solution

Vous pouvez passer n'importe quel objet en tant qu'argument troisième à l'appel DownloadFileAsync (), et vous le retrouverez en tant qu'utilisateur. Dans votre cas, vous pouvez simplement transmettre votre nom de fichier.

Autres conseils

Que diriez-vous de quelque chose comme ça:

private void BeginDownload(
    string uriString,
    string localFile,
    Action<string, DownloadProgressChangedEventArgs> onProgress,
    Action<string, AsyncCompletedEventArgs> onComplete)
{
    WebClient webClient = new WebClient();

    webClient.DownloadProgressChanged +=
        (object sender, DownloadProgressChangedEventArgs e) =>
            onProgress(localFile, e);

    webClient.DownloadFileCompleted +=
        (object sender, AsyncCompletedEventArgs e) =>
            onComplete(localFile, e);

    webClient.DownloadFileAsync(new Uri(uriString), localFile);
}

Dans votre code d'appel, vous pourriez alors avoir un code comme celui-ci:

Action<string, DownloadProgressChangedEventArgs> onProgress =
    (string localFile, DownloadProgressChangedEventArgs e) =>
    {
        Console.WriteLine("{0}: {1}/{2} bytes received ({3}%)",
            localFile, e.BytesReceived,
            e.TotalBytesToReceive, e.ProgressPercentage);
    };

Action<string, AsyncCompletedEventArgs> onComplete =
    (string localFile, AsyncCompletedEventArgs e) =>
    {
        Console.WriteLine("{0}: {1}", localFile,
            e.Error != null ? e.Error.Message : "Completed");
    };

downloader.BeginDownload(
    @"http://url/to/file",
    @"/local/path/to/file",
    onProgress, onComplete);

Si vous ne voulez pas que ce soit trop réutilisable, vous pouvez simplement abandonner les fonctions passées dans l'ensemble et écrire les expressions lambda directement dans votre code:

private void BeginDownload(string uriString, string localFile)
{
    WebClient webClient = new WebClient();

    webClient.DownloadProgressChanged +=
        (object sender, DownloadProgressChangedEventArgs e) =>
            Console.WriteLine("{0}: {1}/{2} bytes received ({3}%)",
                localFile, e.BytesReceived,
                e.TotalBytesToReceive, e.ProgressPercentage);

    webClient.DownloadFileCompleted +=
        (object sender, AsyncCompletedEventArgs e) =>
            Console.WriteLine("{0}: {1}", localFile,
                e.Error != null ? e.Error.Message : "Completed");

    webClient.DownloadFileAsync(new Uri(uriString), localFile);
}

Appelé deux fois, cela vous donnera une sortie comme celle-ci

/ chemin / vers / fichier1: 265/265 octets reçus (100%)
/ chemin / vers / fichier1: Terminé
/ chemin / vers / fichier2: 2134/2134 octets reçus (100%)
/ chemin / vers / fichier2: terminé

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top