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

Services Web Discussion :

Cancel Async call


Sujet :

Services Web

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2006
    Messages : 47
    Par défaut Cancel Async call
    Bonjour,

    J'ai un application client qui fait appel a une super fonction d'un service web.
    Après l'appel de cette fonction, j'aimerais annuler le travail.
    Alors je fait: WebService.CancelAsync(Nothing)

    Le problème: Avant que le processus soit vraiment cancellé, il termine la boucle qu'il avait entammé. Tout est transparent à l'utilisateur, mais le serveur continue de travailler.

    Exemple:

    -Le client appel la création de tables venant d'un fichier texte
    -La fonction sur le serveur entre dans une boucle while not eof
    -Quand même que le client cancel le processus, le serveur execute les opération qui sont dans la boucle.


    Merci beaucoup,

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

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Par défaut
    mettre dans ta boucle while un test

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    If cancel Then
        Exit While
    End If
    ça te permettra de quitter ta boucle plus tôt à toi de voir comment l'intégrer au mieux à ton programme (fichier à refermer, etc...)

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Comme l'indique le nom de la fonction, elle annule le traitement de façon asynchrone. Si ça interrompait le traitement immédiatement, ce serait une fonction synchrone...

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2006
    Messages : 47
    Par défaut
    Cancel n'existe pas dans mon webService !?
    Dois-je importer quelque chose?

    Merci

    Citation Envoyé par Sehnsucht Voir le message
    mettre dans ta boucle while un test

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    If cancel Then
        Exit While
    End If
    ça te permettra de quitter ta boucle plus tôt à toi de voir comment l'intégrer au mieux à ton programme (fichier à refermer, etc...)

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

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Par défaut
    Citation Envoyé par Sehnsucht
    à toi de voir comment l'intégrer au mieux à ton programme

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2006
    Messages : 47
    Par défaut
    Je ne comprend pas ce que tu veux dire.
    Qu'est-ce que je dois tester pour voir si l'appel de la fonction à été annulé?

    Merci


  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par rikidude Voir le message
    Qu'est-ce que je dois tester pour voir si l'appel de la fonction à été annulé?
    une variable (appelée cancel dans l'exemple de Sehnsucht) que tu positionnes à true dans la méthode CancelAsync

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2006
    Messages : 47
    Par défaut
    Citation Envoyé par tomlev Voir le message
    une variable (appelée cancel dans l'exemple de Sehnsucht) que tu positionnes à true dans la méthode CancelAsync
    Ou est-ce que je trouve la méthode CancelAsync? C'est possible de l'apeler à partir de l'application client, mais du côté webService je ne la trouve pas.

    Merci

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    ben c'est toi qui as le code, pas nous... donc on peut pas savoir où elle est

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2006
    Messages : 47
    Par défaut
    CancelAsync est un méthode du serviceWeb, ce n'est pas moi qui à inventé cela!!

    Voici un exemple qui ne marche absoluement pas!

    App Client:
    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
     
    Public Class Form1
     
        Dim webservice As New localhost.Service
     
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Try
                AddHandler webservice.tryinCompleted, AddressOf tryinAsyncComplete
                webservice.tryinAsync()
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
        End Sub
     
        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            Try
                webservice.CancelAsync(Nothing)
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
        End Sub
     
        Private Sub tryinAsyncComplete()
            MessageBox.Show("Opération terminé")
        End Sub
     
    End Class
    WebService:
    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
     
    Imports System.Web
    Imports System.Web.Services
    Imports System.Web.Services.Protocols
    Imports System.Threading
    Imports System.IO
     
    <WebService(Namespace:="http://tempuri.org/")> _
    <WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
    <Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
    Public Class Service
        Inherits System.Web.Services.WebService
     
        Private g_bln_cancel As Boolean
        Public Property Cancelation() As Boolean
            Get
                Cancelation = g_bln_cancel
            End Get
            Set(ByVal value As Boolean)
                g_bln_cancel = value
            End Set
        End Property
     
        Public Sub New()
            Cancelation = False
        End Sub
     
        <WebMethod()> _
        Public Function HelloWorld() As String
            Return "Hello World"
        End Function
     
        <WebMethod()> _
        Public Function tryin() As Boolean
            save1()
            save2()
     
            Return True
        End Function
     
        Private Sub save1()
            Dim l_obj_fichier As New StreamWriter("C:\save1.txt")
            For i As Integer = 0 To 10
                If Cancelation Then
                    l_obj_fichier.WriteLine(i & " CANCELED")
                    l_obj_fichier.Close()
                    Exit Sub
                End If
                l_obj_fichier.WriteLine(i)
                Thread.Sleep(1000)
            Next
     
            l_obj_fichier.Close()
        End Sub
     
        Private Sub save2()
            Dim l_obj_fichier As New StreamWriter("C:\save2.txt")
            For i As Integer = 0 To 10
                If Cancelation Then
                    l_obj_fichier.WriteLine(i & " CANCELED")
                    l_obj_fichier.Close()
                    Exit Sub
                End If
                l_obj_fichier.WriteLine(i)
                Thread.Sleep(1000)
            Next
     
            l_obj_fichier.Close()
        End Sub
     
        Public Overloads Sub CancelAsync(ByVal userState As Object)
            Cancelation = True
            Me.CancelAsync(userState)
        End Sub
     
    End Class
    Si je clique sur le bouton 2 (qui appel la méthode CancelAsync) tout de suite après avoir cliqué sur le bouton 1 (qui appel la fonction du service web), le service web me retourne l'état, mais les 2 procédure sont tout de même executé jusqu'à la fin. C'est à dire que mes 2 fichiers son créer jusqu'à la fin.

  11. #11
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par rikidude Voir le message
    Ou est-ce que je trouve la méthode CancelAsync?
    euh... elle est dans le code que tu as posté

    Citation Envoyé par rikidude Voir le message
    CancelAsync est un méthode du serviceWeb, ce n'est pas moi qui à inventé cela!!
    Ben en tous cas la classe WebService n'a pas de méthode CancelAsync, donc a priori c'est toi (ou la personne qui a développé le service) qui l'a créée...

    Mais bon, peu importe l'origine de cette méthode. Je suis pas expert en webservices, mais je pense qu'il manque l'attribut <WebMethod> sur la méthode CancelAsync. Essaie de lancer le service en debug pour vérifier si CancelAsync est effectivement exécutée.
    D'autre part, pourquoi y a-t-il le mot clé Overloads sur cette méthode ? Je ne vois pas d'autre surcharge...
    Enfin, si CancelAsync est effectivement exécutée, elle devrait provoquer une StackOverFlowException, car elle s'appelle elle-même sans condition...


    Donc à mon avis, CancelAsync n'est pas réellement exécutée par le service (peut-être à cause de l'absence de l'attribut <WebMethod>, mais c'est juste une suggestion...)

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2006
    Messages : 47
    Par défaut
    Effectivement,

    Comme la méthode CancelAsync était absente du service web, c'est moi qui la créée. Si je met seulement "public sub CancelAsync", j'obtiens une erreur lors de l'insertion de mon service web dans mon application Client. C'est pour ça que j'ai ajouté le mot clé "Overloads".

    Si je suis le déroulement en mode débug, tu as raison, il ne passe pas dans la méthode CancelAsync. Je ne crois pas qu'il manque le mot clé WebMethod puisqu'elle ne devrait pas l'être.

    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
     
    CancelAsync(Object)
     
    Category
    Method
     
    Description
    Cancels an asynchronous call to an XML Web service method, unless the call has already completed.
     
    Type
    void
     
    Character
    family
     
    Parameters
    userState	Object
    Pour cité un autre forum, j'ai trouvé cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Because of the stateless nature of HTTP - this is very difficult to
    achieve. The CancelAsync method will only cancel the local thread that
    is making the request. The web service itself has no idea this has
    happened.
    Que faire!?

  13. #13
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    OK, je crois que je commence à comprendre... en fait CancelAsync n'est pas une méthode du WebService lui même, mais une méthode du proxy utilisé par le client. Le client ne manipule pas directement le webservice : il manipule le proxy, qui est une classe générée à partir de la description WSDL du service pour communiquer avec le service.

    Comme la méthode CancelAsync du service a la même signature que celle du proxy, elle est "masquée" par celle du proxy. Il faudrait que tu lui donnes un autre nom, RequestCancellation par exemple. Et (j'insiste) que tu lui mettes l'attribut <WebMethod>, sinon elle ne sera pas dans le WSDL, et donc pas dans le proxy.

    Si j'ai bien compris, la méthode CancelAsync du proxy n'a qu'un rôle technique pour la communication, pas un rôle fonctionnel. Elle ne doit pas être utilisée pour arrêter une opération sur le serveur (d'ailleurs, comment indiquerais-tu quelle opération il faut arrêter ?). Si tu veux pouvoir arrêter une opération en cours, il faut que ton service propose une méthode dédiée à cet usage (de préférence avec un nom qui ne prête pas à confusion...)

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2006
    Messages : 47
    Par défaut
    Je crois qu'on commence à mettre le doigt sur le bobo.

    La méthode CancelAsync à un paramètre UserState. Si Nothing est passer par paramètre, c'est toute les functions/procedures appeler de manière asynchrone qui seront annuler. Sinon, si tu spécifie le UserState, c'est seulement la function ou procedure visée qui sera annuler.

    Donc, en plus d'appeler la méthode CancelAsync, je crois qu'il faudrait faire un autre méthode RequestCancellation, comme tu me mentionnais, avec l'attribut <WebMethod>. Cette procedure pourrais changer l'état d'une variable et ainsi dans toute les autres fonctions, tester cette variable et terminer le processus enclenché.

    Aurais t'il d'autre alternative !?

    Merci!

  15. #15
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Je ne pense pas que tu aies besoin d'appeler CancelAsync du tout en fait... cette méthode signifie, grosso modo, que tu veux annuler l'appel à tryinAsync. Celà annulera l'appel de la fonction s'il n'a pas encore été envoyé au service, mais si la méthode tryin à déjà démarré, ça n'aura aucun effet.

    Sinon, je ne vois pas d'autres façons de faire que de créer une méthode RequestCancellation...

  16. #16
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2006
    Messages : 47
    Par défaut
    J'ai fais une procedure RequestCancellation qui change l'état d'une variable globale à true.

    Cette variable est analyser dans une boucle while de la fonction tryinAsync. Je ne sais pas pourquoi, mais la valeur est toujours faux, même si RequestCancellation est bien executé.

  17. #17
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    fais voir le code de RequestCancellation

  18. #18
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2006
    Messages : 47
    Par défaut
    Voilà!

    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
     
    Imports System.Web
    Imports System.Web.Services
    Imports System.Web.Services.Protocols
    Imports System.Threading
    Imports System.IO
     
    <WebService(Namespace:="http://tempuri.org/")> _
    <WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
    <Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
    Public Class Service
        Inherits System.Web.Services.WebService
     
        Private g_bln_cancel As Boolean
        Public Property Cancelation() As Boolean
            Get
                Cancelation = g_bln_cancel
            End Get
            Set(ByVal value As Boolean)
                g_bln_cancel = value
            End Set
        End Property
     
        Public Sub New()
            Cancelation = False
        End Sub
     
        <WebMethod()> _
        Public Function HelloWorld() As String
            Return "Hello World"
        End Function
     
        <WebMethod()> _
        Public Function tryin() As Boolean
            save1()
            save2()
     
            Return True
        End Function
     
        Private Sub save1()
            Dim l_obj_fichier As New StreamWriter("C:\save1.txt")
            For i As Integer = 0 To 10
                If Cancelation Then
                    l_obj_fichier.WriteLine(i & " CANCELED")
                    l_obj_fichier.Close()
                    Exit Sub
                End If
                l_obj_fichier.WriteLine(i)
                Thread.Sleep(1000)
            Next
     
            l_obj_fichier.Close()
        End Sub
     
        Private Sub save2()
            Dim l_obj_fichier As New StreamWriter("C:\save2.txt")
            For i As Integer = 0 To 10
                If Cancelation Then
                    l_obj_fichier.WriteLine(i & " CANCELED")
                    l_obj_fichier.Close()
                    Exit Sub
                End If
                l_obj_fichier.WriteLine(i)
                Thread.Sleep(1000)
            Next
     
            l_obj_fichier.Close()
        End Sub
     
        <WebMethod()> _
        Public Sub CustomCancel()
            Cancelation = True
        End Sub
     
    End Class
    Merci

  19. #19
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Peut-être que, tout simplement, tryin est déjà terminé quand l'appel à CustomCancel est reçu par le service... ou alors c'est une histoire de thread, genre le service qui peut exécuter une seule webmethod à la fois pour un client donné (je sais plus trop comment fonctionne la gestion des threads en webservices...)

  20. #20
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2006
    Messages : 47
    Par défaut
    Bien, en debug je sais que la fonctionr d'annulation est appelé. Je sais aussi que la fonction tryin n'est pas terminé. Cependant, dans la fonction d'annulation, la variable Cancellation est bien changé à true et aussitot sortie de la fonction, c'est comme si elle n'avait jamais été changé.

Discussions similaires

  1. Réponses: 9
    Dernier message: 23/11/2010, 09h18
  2. [Kylix] Librairie Async Pro et Kylix ?
    Par leclaudio25 dans le forum EDI
    Réponses: 2
    Dernier message: 24/03/2004, 09h03
  3. [TP]Différences Far call <-> Near Call
    Par denokan dans le forum Turbo Pascal
    Réponses: 4
    Dernier message: 02/12/2003, 10h01
  4. [BASM] Comment faire un "Far Call" ?
    Par - Robby - dans le forum Langage
    Réponses: 3
    Dernier message: 03/09/2003, 08h56
  5. [VB6] Cancel et Commondialog
    Par ChrisFAPS dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 09/04/2003, 16h05

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