none
Attendre la fin d'un traitement asynchrone RRS feed

  • Discussion générale

  • Bonjour

      Dans un agent, j'ai besoin de lancer un traitement en asynchrone et que ce traitement soit fini ou non au bout d'un temps donné 20~ on va dire (avant de dépasser les 25s), exécuter un autre traitement.

      Ca donne :
      1) Lancer le traitement en asynchrone
      2) Attendre la fin du traitement ou les 20s sont atteintes
      3) faire un traitement

    Le problème, c'est que l'event DownloadStringCompleted du web client est jamais atteint tel que écrit ci-dessous. Par contre, si j'enlève le WaitOne(25000) et le NotifyComplete()(pour pas quitter l'agent), la il est bien appelé.

    Est ce que c'est pas la bonne façon de faire?
    Ce que j'imagine, c'est que soit "c'est bloqué" sur le waitone, soit la procédure Completed est pas atteignable par le thread en asynchrone....

    En terme de code ca donne ceci

    Dim autoevent As New AutoResetEvent(False) 
    => Défini en variable général de l'agent
    
    Dans la procédure invoke lors de l'exécution de l'agent :
    ThreadPool.QueueUserWorkItem(New WaitCallback(AddressOf WorkMethod), autoevent)
    'Wait for work method to signal.
    autoevent.WaitOne(25000)
            '
            ' TRAITEMENT à faire
            '
    NotifyComplete()
    Debug.WriteLine("Fin de l'agent")
    
    
    Private Sub WorkMethod(stateInfo As Object)
            Dim callback As Action = Sub()
                                         DirectCast(stateInfo, AutoResetEvent).[Set]()
                                     End Sub
            recuperer_image(callback)
    End Sub
    
     Private Sub recuperer_info(callback As Action)
            webClient = New WebClient()
            AddHandler webClient.DownloadStringCompleted, AddressOf webClient_DownloadStringCompleted
            Dim feedUrl = "MON_URL"
            webClient.BaseAddress = ""
            webClient.DownloadStringAsync(New System.Uri(feedUrl, UriKind.Absolute), callback)
        End Sub
    
    Private Sub webClient_DownloadStringCompleted(ByVal sender As Object, ByVal e As DownloadStringCompletedEventArgs)
    => Traitement
    End Sub

    Cordialement.

    Olivier

    • Type modifié Aurel Bera vendredi 7 juin 2013 04:30 Discussion
    mercredi 29 mai 2013 17:53

Toutes les réponses