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 Phone .NET Discussion :

Comment récupérer le résultat d'une fonction asyncrhone [Windows Phone 8]


Sujet :

Windows Phone .NET

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Avril 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2011
    Messages : 28
    Points : 33
    Points
    33
    Par défaut Comment récupérer le résultat d'une fonction asyncrhone
    Bonjour,

    Je développe une appli Windows phone 8.2 en C# sous VS Community.

    Je n'arrive pas a récupérer la valeur de retour des fonctions asynchrones, malgré les exemples pris sur le Web concernant cette implémentation.
    Pour illustrer mon problème par un exemple simple :

    je crée une fonction asynchrone qui me retourne un entier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    private async Task<int> litentierAsync()
            {
                int x;
                var today = await Task.FromResult<string>(DateTime.Now.DayOfWeek.ToString());
                if (today.First() == 'S')
                    x = 16;
                else
                    x = 5;
     
                return x;
            }
    Le constructeur de ma page effectue la récupération de mon entier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    public App()
            {
                this.InitializeComponent();
                this.Suspending += this.OnSuspending;
     
                Task<int> y = litentierAsync();
                int z = y;
     
            }
    Si j'essaye de récupérer le retour de la fonction dans un entier comme ci-dessus, Visual me dit qu'il ne peut pas convertir System.Threading.Tasks.Task<int> en int ...

    Et mes tentatives de cast génèrent des erreurs du style :
    "Unable to cast object of type 'System.Threading.Tasks.Task`1[System.Int32]' to type 'System.IConvertible'."

    Quelqu'un sait-il comment procéder pour récupérer un retour fait en Task<T> ?

    Merci par avance

  2. #2
    Membre expérimenté Avatar de DotNET74
    Homme Profil pro
    Watch R&D Engineer & Apprenti .NET
    Inscrit en
    Août 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Watch R&D Engineer & Apprenti .NET

    Informations forums :
    Inscription : Août 2003
    Messages : 1 986
    Points : 1 453
    Points
    1 453
    Par défaut
    Hello,

    si tu n'utilises pas await ton résultat est vide au moment ou tu fais ton affectation int z = y;

    tu peux utiliser le code suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int z = Task.Run(()=> litentierAsync());
    A tester, moi c'est ce que j'utilise pour ne pas geler mon interface ...
    La Théorie c'est quand on comprends tout mais que rien ne fonctionne.
    La Pratique c'est quand tout fonctionne mais qu'on ne sait pas pourquoi !

    Si vous aimez ma réponse, cliquez sur la main verte Merci

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Avril 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2011
    Messages : 28
    Points : 33
    Points
    33
    Par défaut
    Merci beaucoup de ta réponse.

    Malheureusement le problème reste entier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int z = Task.Run(() => litentierAsync());
    Provoque aussi l'erreur de Cast "Impossible de convertir le type System.Threading.Tasks.Task<int> en int".
    Et je ne peux pas utiliser await car le constructeur de la page n'est pas une fonction Asynchrone...

  4. #4
    Membre expérimenté
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2005
    Messages
    562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2005
    Messages : 562
    Points : 1 511
    Points
    1 511
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int i = await litentierAsync();
    fonctionnera mieux !

    Bon code,
    J@ck.
    Pas de réponse par MP, merci.

    Penser au ça fait plaisir

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Avril 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2011
    Messages : 28
    Points : 33
    Points
    33
    Par défaut
    En fait, vos les deux solutions (DotNet74 et J@ckHerror) fonctionnent à condition d'être dans une procédure asynchrone, ce qui oblige à passer par un second niveau pour récupérer le résultat de la première fonction :

    Fonction asynchrone renvoyant une valeur <-- Fonction asynchrone Void récupérant la valeur<-- Fonction non asysnchrone ... Pas NiCr mais bon ...

    merci:

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 23/01/2007, 09h20
  2. Réponses: 11
    Dernier message: 06/09/2006, 12h48
  3. Récupérer le résultat d'une fonction dans une balise html
    Par Hayato dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 19/06/2006, 17h04
  4. Réponses: 6
    Dernier message: 08/06/2006, 10h07
  5. Réponses: 3
    Dernier message: 24/03/2006, 13h52

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