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

Framework .NET Discussion :

Méthode Async+Event To awaitable Task


Sujet :

Framework .NET

  1. #1
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Points : 2 331
    Points
    2 331
    Par défaut Méthode Async+Event To awaitable Task
    Bonjour,

    j'ai un bout de code WCF qui envoie une commande à un serveur, ce dernier répond par une callback si réponse il y a, générant côté client un événement.

    J'aimerais refaire ce fonctionnel avec un task await, il existe un pattern pour intégrer mon existant où je dois revoir ma logique de code ?

    Merci

  2. #2
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Points : 2 331
    Points
    2 331
    Par défaut
    Je continue mes recherches à ce sujet.

    Il existe Task.Factory.FromAsync qui permet de passer un couple de Begin/End méthodes, mais je pêche à coller ça avec mon modèle d'événements

  3. #3
    Membre éprouvé Avatar de worm83
    Homme Profil pro
    Architecte logiciel
    Inscrit en
    Février 2010
    Messages
    459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte logiciel
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2010
    Messages : 459
    Points : 1 118
    Points
    1 118
    Par défaut
    Citation Envoyé par Arnard Voir le message
    Bonjour,

    j'ai un bout de code WCF qui envoie une commande à un serveur, ce dernier répond par une callback si réponse il y a, générant côté client un événement.

    J'aimerais refaire ce fonctionnel avec un task await, il existe un pattern pour intégrer mon existant où je dois revoir ma logique de code ?

    Merci
    Je répondrais, un peu des deux XD.

    Il te suffit juste de retourner l'objet Task, par exemple en incluant en plus le pattern "async/await" , avec un exemple idiot:

    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
     
          public Task<string> DoIt()
            {
                return Task<string>.Factory.StartNew(() =>
                  {
                      var retour = "";
                      for (int i = 0; i < 10000; i++) //Ici on a l'appel à ton service
                      {
                          retour = i.ToString();
     
                      }
                      return retour; ;
                  });
     
            }
     
     
            public async void WaitDoIt()
            {
                var test = await DoIt();
            }
    Je suppose que c'est ce que tu voulais faire. Désolé si j'ai mal compris.
    "Le train de tes injures roule sur le rail de mon indifférence."

    "Monde de merde !!"

    Georges Abitbol.

  4. #4
    Membre expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Points : 3 568
    Points
    3 568
    Par défaut
    Voila un exemple d'utilisation de FromAsync avec un memorystream (le principe est le même)
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    var memoryStream = new MemoryStream();
     
     
    var buffer = new byte[100];
     
     
    var bytesread = await Task<int>.Factory.FromAsync(memoryStream.BeginRead, memoryStream.EndRead, buffer, 0, buffer.Length,null);

    Il faut lui passer la méthode begin, celle end, et les paramètres de la méthode begin (plus un objet state, qui est ici a null)
    Microsoft MVP : Windows Platform

    MCPD - Windows Phone Developer
    MCPD - Windows Developer 4

    http://www.guruumeditation.net

    “If debugging is the process of removing bugs, then programming must be the process of putting them in.”
    (Edsger W. Dijkstra)

  5. #5
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Points : 2 331
    Points
    2 331
    Par défaut
    Je vais rajouter du code histoire d'être moins obscur ^^

    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
     
    class Client : ICallback //décrit la callback depuis le service WCF
    {
        //Appelle le serviuce WCF pour envoyer la commande chez le client
        public void SendCommand(Command cmd)
        {
            monServiceWCF.SendCommand(cmd);
        }
     
        public EventHandler<ResultCommandEventArgs> OnResultFired;
     
        [OperationContract(IsOneWay = true)] // de l'interface ICallback, je le colle ici pour description
        public void FireResult(ResultCommand res)  
        {
            if(OnResultFired != null)
                  OnResultFired(ResultCommandEventArgs(res));
        }
    }
    Usage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Client monClient  = ...
    monClient.OnResultFired += processResult;
     
     
    /// Later ///
    monClient.SendCommand(cmd);
    Donc j'ia un appel sans retour, et le résultat revient par une callback. Le client ne bloque pas et peut exploiter quand il a besoin.

    Et là je me dis, que SendCommand puisse me renvoyer le résultat en async (y'a un scénario qui m'intéresse pour), ce serait cool, histoire de traiter les données à la chaine. Je me disais donc qu'une Task qui englobe le call, et qui peut gérer le callback en une seule méthode, ce serait chouette. Mais je ne vois pas comment faire. Arriver à quelque chose du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ResultCommand res = await monclient.SendCommandAsync(cmd);
    Dans l'idée, il faudrait que le processus qui fait l'appel WCF se mette en attente de l'occurence de l'événement, pour ensuite renvoyer la valeur.

    Le FromAsync me semblait ok pour intégrer le système, mais il faudrait que le EndInvoke soit en attente de l'événement retour, et puisse l'interpréter, et je ne vois pas comment le faire (vu que par essence l'événement appelle son propre délégué); Donc je ne suis pas sûr que FromAsync soit la bonne chose

    En un sens je pense que je tente un truc foireux, mais en même temps la curiosité me pousse à trouver une solution élégante

  6. #6
    Membre expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Points : 3 568
    Points
    3 568
    Par défaut
    Tu as regardé les TaskCompletionSource (https://msdn.microsoft.com/en-us/lib...=vs.110).aspx) ?

    Ca donnerais un truc du genre (super simplifié, il faudrait associé un TCS à chaque requête et faire le lien avec quel TCS correspond le FireResult):
    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
     
    class Client : ICallback //décrit la callback depuis le service WCF
    {
        private TaskCompletionSource<object> _tcs; 
       public Task<object> SendCommandAsync(Command cmd)
       {
                _tcs = new TaskCompletionSource<object>();
                monServiceWCF.SendCommand(cmd);
                return _tcs.Task;
       }
     
       [OperationContract(IsOneWay = true)] // de l'interface ICallback, je le colle ici pour description
       public void FireResult(ResultCommand res)
       {
                _tcs.SetResult(res);
       }
    }
    Microsoft MVP : Windows Platform

    MCPD - Windows Phone Developer
    MCPD - Windows Developer 4

    http://www.guruumeditation.net

    “If debugging is the process of removing bugs, then programming must be the process of putting them in.”
    (Edsger W. Dijkstra)

  7. #7
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Points : 2 331
    Points
    2 331
    Par défaut
    Mais ça me semble matcher à mon besoin, excellent. Je vais faire un peu de code pour enrober tout ça, mais le mécanisme me convient

    MERCI !

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

Discussions similaires

  1. Quels sont les différences entre async/await et une Task ?
    Par Deesmon dans le forum Framework .NET
    Réponses: 2
    Dernier message: 31/08/2015, 17h48
  2. Async Await Task Constructeur ViewModel
    Par Kikuts dans le forum Framework .NET
    Réponses: 1
    Dernier message: 06/07/2015, 21h38
  3. Jcombobox incohérence méthode d'event
    Par chaminca dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 21/07/2014, 07h48
  4. WP 7 et 8 : utiliser les mots clefs await/async et Task<T>
    Par rolandl dans le forum Windows Phone
    Réponses: 2
    Dernier message: 27/03/2013, 09h40
  5. Appel de méthode sur Click event
    Par Ant8386 dans le forum ASP.NET
    Réponses: 3
    Dernier message: 03/11/2006, 12h10

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