IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

[C#]Travailler en synchrone avec des objets asynchrone


Sujet :

Windows Forms

  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut [C#]Travailler en synchrone avec des objets asynchrone
    Bonjour à tous,

    Je fais du téléchargement FTP via le WebClient. Cet objet possède des méthodes "DownloadFile" et "DownloadFileAsync". Il possède également des évennement sur l'avancement du téléchargement, lorsqu'on l'utilise en mode asynchrone.

    J'aimerai pouvoir lancer les téléchargements en mode asynchrone, mais bloquer mon processus quand même pour qu'à la fin du téléchargement d'un fichier je puisse en télécharger un nouveau. Vous voyez mon soucis?

    En fait j'ai quelque chose du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    foreach(FileInfo oFileInfo in m_oFileList)
    {
        m_oWebClient.DownloadFileAsync(m_ftpAddress + "\\" + oFileInfo.Name, "c:\\" + oFileInfo.Name);
    }
    Et j'aimerai bloquer le processus tant que le fichier n'a pas été téléchargé. Malheureusement si je fonctionne en Synchrone, je ne récupèrerai pas d'évennement d'avancement du téléchargement

    Quelqu'un a une idée?

    Merci beaucoup,

    Aurélien
    "Heureusement qu'il y avait mon nez, sinon je l'aurais pris en pleine gueule" Walter Spanghero

  2. #2
    Membre actif
    Inscrit en
    Août 2006
    Messages
    381
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 381
    Points : 252
    Points
    252
    Par défaut
    Bonjour,

    tu pourrais lancer un evenement qui indique que ton téléchargement est terminé.

    Ou alors tu pourrais faire de la synchronisation de thread.

    Ciao

  3. #3
    Rédacteur
    Avatar de Erakis
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2003
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 523
    Points : 233
    Points
    233
    Par défaut
    Bonjour

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    // Variable membre de ta classe
    bool fileCompleted = false;
     
    // À mettre dans le procédure où tu télécharge tes fichiers uns à uns
    m_oWebClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(m_oWebClient_DownloadProgressChanged);
    foreach(FileInfo oFileInfo in m_oFileList)
    {
        m_oWebClient.DownloadFileAsync(m_ftpAddress + "\\" + oFileInfo.Name, "c:\\" + oFileInfo.Name, oFileInfo);
        while (!fileCompleted)
        {
            System.Threading.Thread.Sleep(30);
        }
     
        // Ton fichier à été complèté ici !
     
        // Remettre ton flag à false pour l'autre fichier à télécharger
        fileCompleted = false;
    }
     
    private void m_oWebClient_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
    {
        // Récupération de ton object FileInfo founis avant le téléchargement
        FileInfo file = (FileInfo)e.UserState;
     
        // Ici tu as ton progress avec e.BytesReceived ou e.TotalBytesToReceive
    }
     
    private void m_oWebClient_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
    {
        // Récupération de ton object FileInfo founis avant le téléchargement
        FileInfo file = (FileInfo)e.UserState;
        fileCompleted = true; ;
    }

    Voilà, j'espère que cela te donnera une bonne idée.
    Pour bien faire tu devrais utilisern AutoResetEvent et faire un WaitOne au lieu du While.

    Bonne chance
    Mieux vaut ne rien savoir que beaucoup savoir à moitié !
    Faite vous en pas avec la vie, personne en est sortie vivant !

  4. #4
    Membre expérimenté
    Avatar de Mehdi Feki
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 113
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 113
    Points : 1 566
    Points
    1 566
    Par défaut
    J'ai une petite idée qu'il faudra tester :

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    private void client_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
    {
        WebClient client = new WebClient ();
        Uri uri = new Uri(address);
        client.DownloadFileCompleted += new AsyncCompletedEventHandler (client_DownloadFileCompleted);
        FileInfo oFileInfo =m_oFileList[Index++];
        client.DownloadFileAsync(m_ftpAddress + "\\" + oFileInfo.Name, "c:\\" + oFileInfo.Name);
    }

    pour lancer le telehargement :

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    client_DownloadFileCompleted(null,null);
    Mehdi Feki : Modérateur .Net

Discussions similaires

  1. travailler avec des objets statiques
    Par Romain227 dans le forum Débuter
    Réponses: 12
    Dernier message: 23/11/2011, 14h41
  2. Réponses: 2
    Dernier message: 14/06/2008, 18h03
  3. [XSD] Mapper intelligemment un XSD avec des Objets Java
    Par PoteA_Tooz dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 09/05/2008, 10h33
  4. [POO] Listing avec des objets
    Par estampille dans le forum Langage
    Réponses: 5
    Dernier message: 27/08/2007, 16h19
  5. Réponses: 1
    Dernier message: 05/06/2007, 17h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo