none
Async problème take 2 RRS feed

  • Question

  • Bonjour

    J'avais déjà poser cette question et comme nous avions travaillez et que la réponse est longue... j'aimerais ne pas avoir à continuer en bas de l'autre page... si vous êtes d'accord...

    J'ai mis ça très simple pour que ça aille bien!

    voici ce que je fait mais ça ne fonctionne pas en même temps que le reste du programme... 

    Le programme doit attendre quand même après ce code pour continuer le reste

    Private Async Sub TimerMulti_Tick
    
           Await verifier
    
    End sub
    
    Public Async Function verifier
    
           dim x as integer = 0
    
           for x = o to 1000
    
           end for
    
           return 0
    
    End sub

    Merci de me corriger!

    Pierre


    La vie est belle!

    jeudi 21 juillet 2016 20:21

Réponses

  • Bonjour,

    Le "but" de Await/Async, c'est de permettre d'attendre ce qui se passe dans un autre thread (comme leur nom l'indique).

    Donc quand vous écrivez une ligne du genre :

    Await Machin()
    Console.WriteLine("coucou")

    La méthode Machin sera exécutée dans un autre thread (peut-être, mais c'est un autre sujet) mais on n'écrira rien dans la Console tant que Machin n'aura pas fini.

    Exemple :

        Sub Main()
            TimerMulti_Click()
            Console.ReadLine()
        End Sub
    
        public Sub TimerMulti_Click()
            Dim i =  Verifier()
    
            Console.WriteLine("coucou")
            Console.ReadLine()
        End Sub
    
        public Function Verifier As Task(Of Integer)
            return Task.Run(
                Function() 
                    For x = 0 To 1000
                        Console.Write(".")
                    Next
                    return 0
                End Function)
        End Function

    Dans ce cas, on lance la fonction Verifier sans attendre le résultat. Donc Coucou sera affiché avant les ".".

    Si l'on modifie légèrement le code :

        Sub Main()
            TimerMulti_Click()
            Console.ReadLine()
        End Sub
    
        public Async Sub TimerMulti_Click()
            Dim i = Await  Verifier()
    
            Console.WriteLine("coucou")
            Console.ReadLine()
        End Sub
    
        public Function Verifier As Task(Of Integer)
            return Task.Run(
                Function() 
                    For x = 0 To 1000
                        Console.Write(".")
                    Next
                    return 0
                End Function)
        End Function
    Dans ce cas, comme on a mis Await, on attend que la méthode Verifier soit terminée. On a donc Coucou après les ".".


    Richard Clark
    Consultant - Formateur .NET
    http://www.c2i.fr
    Depuis 1996: le 1er site .NET francophone

    • Proposé comme réponse Jordane Aucagne lundi 25 juillet 2016 13:12
    • Marqué comme réponse Peter_ZZZZZ vendredi 29 juillet 2016 20:55
    vendredi 22 juillet 2016 07:21
  • Normalement c'est la théorie. Maintenant l'implémentation de AsynC/Await est compliquée. Il semble que le compilateur décide beaucoup de comment le flue d'action est utilisé.

    Il faut faire des tests.

    • Marqué comme réponse Peter_ZZZZZ jeudi 4 août 2016 15:53
    jeudi 4 août 2016 07:16

Toutes les réponses

  • Bonjour,

    Le "but" de Await/Async, c'est de permettre d'attendre ce qui se passe dans un autre thread (comme leur nom l'indique).

    Donc quand vous écrivez une ligne du genre :

    Await Machin()
    Console.WriteLine("coucou")

    La méthode Machin sera exécutée dans un autre thread (peut-être, mais c'est un autre sujet) mais on n'écrira rien dans la Console tant que Machin n'aura pas fini.

    Exemple :

        Sub Main()
            TimerMulti_Click()
            Console.ReadLine()
        End Sub
    
        public Sub TimerMulti_Click()
            Dim i =  Verifier()
    
            Console.WriteLine("coucou")
            Console.ReadLine()
        End Sub
    
        public Function Verifier As Task(Of Integer)
            return Task.Run(
                Function() 
                    For x = 0 To 1000
                        Console.Write(".")
                    Next
                    return 0
                End Function)
        End Function

    Dans ce cas, on lance la fonction Verifier sans attendre le résultat. Donc Coucou sera affiché avant les ".".

    Si l'on modifie légèrement le code :

        Sub Main()
            TimerMulti_Click()
            Console.ReadLine()
        End Sub
    
        public Async Sub TimerMulti_Click()
            Dim i = Await  Verifier()
    
            Console.WriteLine("coucou")
            Console.ReadLine()
        End Sub
    
        public Function Verifier As Task(Of Integer)
            return Task.Run(
                Function() 
                    For x = 0 To 1000
                        Console.Write(".")
                    Next
                    return 0
                End Function)
        End Function
    Dans ce cas, comme on a mis Await, on attend que la méthode Verifier soit terminée. On a donc Coucou après les ".".


    Richard Clark
    Consultant - Formateur .NET
    http://www.c2i.fr
    Depuis 1996: le 1er site .NET francophone

    • Proposé comme réponse Jordane Aucagne lundi 25 juillet 2016 13:12
    • Marqué comme réponse Peter_ZZZZZ vendredi 29 juillet 2016 20:55
    vendredi 22 juillet 2016 07:21
  • Bonjour

    Merci pour la réponse

    J'aimerais avant que l'on continue que vous validiez que async sans await c'est pour que 2 codes puissent fonctionner en même temps

    Si ce n'est pas le cas..

    J'aimerais savoir comment faire pour qu'une sub s'exécute durant que l'utilisateur utilise une autre fonction du programme

    Si c'est le cas.. pourriez-vous me donner une exemple simple comme vous avez fait dans votre réponse afin que je saisisse le sens et que je le transpose par la suite dans mon projet?

    Merci à l'avance

    Pierre


    La vie est belle!

    vendredi 22 juillet 2016 15:51
  • Bonjour

    est-ce possible de continuer la discussion s'il vous plaît...



    La vie est belle!

    jeudi 28 juillet 2016 20:12
  • async et await sont obligatoirement ensemble est sont indissociables.

    Si vous mettez un await sans async, ca compilera pas.

    Si vous mettez un async sans await vous aurez un warning du compilateur.

    Avez-vous essayez le code que je vous ai proposé et l'avez vous analysé ?


    Richard Clark
    Consultant - Formateur .NET
    http://www.c2i.fr
    Depuis 1996: le 1er site .NET francophone

    vendredi 29 juillet 2016 07:45
  • Merci beaucoup pour votre réponse...

    C'est qu'on m'avait dit que c'est avec une function asynchrone qu'on pouvait faire ce que je voulais

    Pourriez-vous alors me dire comment faire pour que du code s'exécute en même temps que d'autre code parce qu'au démarrage de mon programme il y a tellement de code que ça dure 10 secondes.. et durant l'utilisation des fois... la recherche se fait au même moment où l'on travail et l'utilisateur doit attendre que cette recherche soit terminée

    Si je n'ai pas essayé votre code c'est parce que j'ai tellement de asynch et await dans mon code suite à cette histoire que je vois déjà ce que ça fait  lollll ce n,est pas parce que je ne voulais pas!!  désolé

    Merci!

    Pierre

    Bonne journée!


    La vie est belle!

    vendredi 29 juillet 2016 11:40
  • Juste une note sur une confusion: Await et Async ne créent pas de Thread supplémentaires.

    Await et Async "empruntent" du temps en promettant le retour d'un Task(of TResult) sur le Thread.

    Spécifiquement le msdn https://msdn.microsoft.com/en-us/library/mt674902.aspx

    indique:

    Async methods are intended to be non-blocking operations. An Await expression in an async method doesn’t block the current thread while the awaited task is running. Instead, the expression signs up the rest of the method as a continuation and returns control to the caller of the async method.

    The Async and Await keywords don't cause additional threads to be created.

    mercredi 3 août 2016 13:53
  • Alors je comprends qu'effectivement async va attendre await mais que le tout se fera en parrallèle au reste du code..

    est-ce bien cela?

    Merci Cyrille!!!!!


    La vie est belle!

    mercredi 3 août 2016 20:24
  • Normalement c'est la théorie. Maintenant l'implémentation de AsynC/Await est compliquée. Il semble que le compilateur décide beaucoup de comment le flue d'action est utilisé.

    Il faut faire des tests.

    • Marqué comme réponse Peter_ZZZZZ jeudi 4 août 2016 15:53
    jeudi 4 août 2016 07:16
  • Ok super...

    je comprends bien...

    je vais transférer le post qui s'en va vers une autre question comme je n'avais pas de réponse à la suite avant la vôtre j'ai ouvert une nouvelle question plus précise :

    https://social.msdn.microsoft.com/Forums/fr-FR/38252fa8-bc07-46bd-8f2b-5d4cf493742a/faire-fonctionner-2-code-en-mme-temps?forum=vbasicfr

    Merci


    La vie est belle!

    jeudi 4 août 2016 15:55