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 :

Task await et async


Sujet :

C#

  1. #1
    Membre chevronné Avatar de petitours
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Février 2003
    Messages
    1 935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 935
    Points : 2 014
    Points
    2 014
    Par défaut Task await et async
    Bonjour

    N'ayant utilisé que des backgroundWorker jusque là je m'intéresse au Task introduit avec les framework 4.0 et Task.Run introduit avec 4.5

    J'arrive à faire tourner des Task mais rien de ce que je veux en asynchrone. Merci de me confirmer si j'ai compris la cause à ce problème :
    Task ne peut offrir de l'asynchrone que si dans la tache on a un await MethodeAsync() c'est à dire une méthode offerte par une classe de Microsoft qui permet l'utilisation de await, par exemple cette méthode https://msdn.microsoft.com/fr-fr/lib...v=vs.110).aspx

    Du coup si j'ai une méthode perso que je veux faire tourner en tache de fond alors qu'elle n'utilise pas une telle fonction, il ne m'est pas possible d'utiliser Task. C'est ça ?

    Merci par avance
    Il y a 10 sortes de personnes dans le monde : ceux qui comprennent le binaire et les autres

  2. #2
    Membre chevronné
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Points : 2 209
    Points
    2 209
    Par défaut
    Je suis pas sûr de tout piger, surtout que l'asynchrone c'est carrément pas ma tasse de thé encore

    Mais si j'ai bien pigé ; la question c'est peut-on "Awaiter" une méthode perso ?
    Alors la réponse est oui

    je vois 3 "cas" différents (un exemple sera en fin)

    - Tu as une méthode sur laquelle tu as le contrôle (ie: tu peux modifier le code de la méthode)
    Si cette méthode utilise une autre méthode Async ; tu la définis comme Async à son tour et tu Await l'autre
    Si cette méthode n'utilise pas de méthode Async ; la méthode doit retourner un Task ou Task(Of T) (afin d'être awaitable par l'appelant) ; typiquement ça peut se faire grâce à un Task.Run(Function retournant le résultat)
    - Tu as une méthode sur laquelle tu n'as pas le contrôle (ie tu ne peux pas y toucher) ; en fait ça rejoint le 2ème cas précédent ; c'est au niveau de l'appelant qu'on Await Task.Run(Function qui appelle ma méthode)
    Bon je me doute que c'est pas spécialement clair (déjà pour moi ) du coup j'ai préparé un petit exemple bidon :
    Type contrôle Nom contrôle
    TextBox AddressInput
    CheckBox TaskMethodChoice
    CheckBox AsyncMethodChoice
    Button DoTheJob
    RichTextBox ContentOutput
    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
    33
    Public Class AsyncSampleForm
     
        Private Async Sub DoTheJob_Click() Handles DoTheJob.Click
            ContentOutput.Clear()
     
            If TaskMethodChoice.Checked Then
                ContentOutput.Text = Await RetrieveContentTaskMethod(AddressInput.Text)
            ElseIf AsyncMethodChoice.Checked Then
                ContentOutput.Text = Await RetrieveContentAsyncMethod(AddressInput.Text)
            Else
                ContentOutput.Text = Await Task.Run(Function() RetrieveContent(AddressInput.Text))
            End If
        End Sub
     
        Private Function RetrieveContentTaskMethod(address As String) As Task(Of String)
            Using client As New Net.WebClient
                Return Task.Run(Function() client.DownloadString(address))
            End Using
        End Function
     
        Private Async Function RetrieveContentAsyncMethod(address As String) As Task(Of String)
            Using client As New Net.WebClient
                Return Await client.DownloadStringTaskAsync(address)
            End Using
        End Function
     
        Private Function RetrieveContent(address As String) As String
            Using client As New Net.WebClient
                Return client.DownloadString(address)
            End Using
        End Function
     
    End Class
    Et au lancement du code ; toute l'UI reste responsive.
    Nous sommes tous plus ou moins geek : ce qui est inutile nous est parfaitement indispensable ( © Celira )
    À quelle heure dormez-vous ?
    Censément, quelqu'un de sensé est censé s'exprimer sensément.

  3. #3
    Membre chevronné Avatar de petitours
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Février 2003
    Messages
    1 935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 935
    Points : 2 014
    Points
    2 014
    Par défaut
    Bonjour et un grand merci d'avoir pris le temps de répondre avec exemple à l'appui

    Dans cet exemple je vois l'utilisation de la méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    client.DownloadStringTaskAsync(address)
    qui est ce que j'appelais une méthode asynchrone fournie par Microsoft.

    Ça j'arrive bien à l'utiliser.

    Ma question concerne une action longue qui n'utiliserait pas de méthode async fournies par Microsoft

    Par exemple si j'ai cette fonction triviale
    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
    private void TrucLong()
    {
    Uint64 varTresGrande = 0;
    Uint64 varTresGrande2 = 0;
    Uint64 varTresGrande3 = 0;
     
    While (varTresGrande < 10000000000000000000000000000)
    {
       While (varTresGrande2 < 10000000000000000000000000000)
       {
           While (varTresGrande3 < 10000000000000000000000000000)
           {
              varTresGrande3 += 1 ;
           }
           varTresGrande2 += 1 ;
       }
       varTresGrande += 1 ;
    }
    }
    Peut on mettre cette fonction dans une méthode Async ?

    Merci
    Il y a 10 sortes de personnes dans le monde : ceux qui comprennent le binaire et les autres

  4. #4
    Membre chevronné
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Points : 2 209
    Points
    2 209
    Par défaut
    Il n'y a rien d'asynchrone dans cette méthode ; donc non on ne peut pas en faire une méthode asynchrone ; par contre on peut l'appeler de manière asynchrone ; comme illustré dans mon 3ème exemple (RetrieveContent)
    Nous sommes tous plus ou moins geek : ce qui est inutile nous est parfaitement indispensable ( © Celira )
    À quelle heure dormez-vous ?
    Censément, quelqu'un de sensé est censé s'exprimer sensément.

  5. #5
    Membre chevronné Avatar de petitours
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Février 2003
    Messages
    1 935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 935
    Points : 2 014
    Points
    2 014
    Par défaut
    mince j'avais mal compris l'exemple (c'est du VB non ?)

    J'ai pigé, merci beaucoup

    C'est une vraie révolution ce truc par rapport au backgroundworker !
    Il y a 10 sortes de personnes dans le monde : ceux qui comprennent le binaire et les autres

  6. #6
    Membre chevronné
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Points : 2 209
    Points
    2 209
    Par défaut
    ah oui flute ; j'avais pas fait gaffe qu'on était en C# là ; c'est ça de répondre à plusieurs sujets en même temps ; je remets le code en C# du post précédent pour d'éventuels futurs lecteurs

    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
    33
    34
    35
    36
    37
    38
    public class AsyncSampleForm
    {
        private async void DoTheJob_Click ()
        {
            contentOutput.CLear ();
     
            if (taskMethodChoice.Checked)
                contentOutput.Text = await RetrieveContentTaskMethod (addressInput.Text);
            else if (AsyncMethodChoice.Checked)
                contentOutput.Text = await RetrieveContentAsyncMethod (addressInput.Text);
            else
                contentOutput.Text = await Task.Run (() => RetrieveContent (addressInput.Text));
        }
     
        private Task<string> RetrieveContentTaskMethod (string address)
        {
            using (var client = new Net.WebClient ())
            {
                return Task.Run (() => client.DownloadString (address));
            }
        }
     
        private async Task<string> RetrieveContentAsyncMethod (string address)
        {
            using (var client = new Net.WebClient ())
            {
                return await client.DownloadStringTaskAsync (address);
            }
        }
     
        private string RetrieveContent (string address)
        {
            using (var client = new Net.WebClient ())
            {
                return client.DownloadString (address);
            }
        }
    }
    Nous sommes tous plus ou moins geek : ce qui est inutile nous est parfaitement indispensable ( © Celira )
    À quelle heure dormez-vous ?
    Censément, quelqu'un de sensé est censé s'exprimer sensément.

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

Discussions similaires

  1. Méthode Async+Event To awaitable Task
    Par Arnard dans le forum Framework .NET
    Réponses: 6
    Dernier message: 14/09/2015, 10h47
  2. 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
  3. Async Await Task Constructeur ViewModel
    Par Kikuts dans le forum Framework .NET
    Réponses: 1
    Dernier message: 06/07/2015, 21h38
  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. Async/Await avec Silverlight & WCF
    Par Joffrey Kern dans le forum Silverlight
    Réponses: 5
    Dernier message: 24/05/2012, 09h45

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