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

C# Discussion :

instruction await pour methodes asynchrones


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    906
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 906
    Par défaut instruction await pour methodes asynchrones
    Bjr à tous, j'essaie de comprendre le fonctionnement des méthodes asynchrones en utilisant un exemple vu sur la doc de microsoft :

    https://learn.microsoft.com/fr-fr/do...perators/await

    Code : 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
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net;
    using System.Net.Http;
    using System.Text;
    using System.Threading.Tasks;
     
    namespace TestsSharpPcap
    {
        public class AwaitOperator
        {
            public static async Task Main()
            {
                Task<int> downloading = DownloadDocsMainPageAsync();
                Console.WriteLine($"{nameof(Main)}: Launched downloading.");
     
                int bytesLoaded = await downloading;
                Console.WriteLine($"{nameof(Main)}: Downloaded {bytesLoaded} bytes.");
            }
     
            private static async Task<int> DownloadDocsMainPageAsync()
            {
                Console.WriteLine($"{nameof(DownloadDocsMainPageAsync)}: About to start downloading.");
                var client = new HttpClient();
                byte[] content = await client.GetByteArrayAsync("http://www.google.com/");
                Console.WriteLine($"{nameof(DownloadDocsMainPageAsync)}: Finished downloading.");
                return content.Length;
            }
        }
    }
    Le problème que j'ai est que quand la tache "DownloadDocsMainPageAsync" est lancée et qu'elle arrive à l'opérateur await elle s'exécute et termine le programme sans exécuter le reste du code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Console.WriteLine($"{nameof(DownloadDocsMainPageAsync)}: Finished downloading.");
    return content.Length;
    ce qui donne comme résultat :

    DownloadDocsMainPageAsync: About to start downloading.
    Main: Launched downloading.

    au lieu comme le stipule le cours :

    // Output similar to:
    // DownloadDocsMainPageAsync: About to start downloading.
    // Main: Launched downloading.
    // DownloadDocsMainPageAsync: Finished downloading.
    // Main: Downloaded 27700 bytes.

    Ils précisent : "L’opérande d’une expression await doit fournir une notification lorsqu’une tâche se termine. En général, un délégué est appelé lorsque la tâche se termine, que ce soit une réussite ou un échec. La section await de la spécification du langage C# fournit les détails sur la façon dont ces notifications sont implémentées."
    mais je n'arrive pas à voir d'exemples précis, si quelqu'un a une idée MERCI

  2. #2
    Membre Expert
    Avatar de PixelJuice
    Homme Profil pro
    Ingénieur .NET & Game Designer
    Inscrit en
    Janvier 2014
    Messages
    664
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur .NET & Game Designer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2014
    Messages : 664
    Par défaut
    Bonjour,

    C'est très simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Task<int> downloading = DownloadDocsMainPageAsync();
    La méthode est lancée en mode "on s'en fou", et donc elle fait sa vie et tu ne l'attends pas, il faut donc mettre un await là aussi (A noter que ce n'est pas une mauvaise chose en soi, mais ce n'est pas le but recherché ici)


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int downloading = await DownloadDocsMainPageAsync();
    Tu peux voir d'ailleurs que la variable de retour fait beaucoup plus sens d'un coup.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    906
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 906
    Par défaut
    Merci pour la réponse, après du temps passé dessus j'ai trouvé une solution en testant le status de la tache :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    int status=(int)downloading.Status;
        if (status==1)
    {
        downloading.Wait();
    }
    Ca fonctionne mais je n'ai pas compris comme tu fais j'ai essayé avec ta façon et sauf erreur de ma part ca ne marche pas. Mon code :
    Code : 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
     
        public static async Task Main()
        {
            Task<int> downloading = DownloadDocsMainPageAsync();
            Console.WriteLine($"{nameof(Main)}: Launched downloading.");
            int status=(int)downloading.Status;
                if (status==1)
            {
                downloading.Wait();
            }
            int bytesLoaded = await downloading;
            Console.WriteLine($"{nameof(Main)}: Downloaded {bytesLoaded} bytes.");
        }
     
        private static async Task<int> DownloadDocsMainPageAsync()
        {
            Console.WriteLine($"{nameof(DownloadDocsMainPageAsync)}: About to start downloading.");
            var client = new HttpClient();
            byte[] content = await client.GetByteArrayAsync("http://www.google.com/");
            Console.WriteLine($"{nameof(DownloadDocsMainPageAsync)}: Finished downloading.");
            Console.WriteLine(content.Length);
            return content.Length;
        }
    }
    Merci si tu veux revenir sur le sujet n'hésite pas merci

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    906
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 906
    Par défaut Modif
    Finalement pas besoin de tester le status suffit

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 24
    Dernier message: 13/11/2006, 09h00
  2. instruction valable pour une ligne d'une table
    Par Skizo dans le forum Access
    Réponses: 2
    Dernier message: 18/05/2006, 15h51
  3. [SOAP] API pour appels asynchrones
    Par Dar Shak dans le forum API standards et tierces
    Réponses: 3
    Dernier message: 26/04/2005, 08h57
  4. [C#] [Sockets] Eclaircissements pour connexions asynchrones
    Par Sinclair dans le forum Windows Forms
    Réponses: 6
    Dernier message: 08/06/2004, 17h50

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