locked
Retarder le retrour d'une methode ? RRS feed

  • Discussion générale

  • Bonjour,

     

    j'ai une class ou j'ai une méthode cette methode recois le résultats d'une autre méthode qui est dans la mm class

    je désire retarder le retour de la dernière méthode afin qu'elle reçoit le consulats de la première .  

     

    mon code est le suivant :

     

     

     public class GetMethods
        {
           
            object data=null;
            Synchro Synchro = new Synchro();

     

    //la première methode .     
             void test(IAsyncResult result)
            {
              
                try
                {
                  
                    data = Synchro.EGetPageProxy(result);

                    System.Diagnostics.Debug.WriteLine("data = " + data);
                }
                catch (Exception ex)
                {
                    // handle the exception
                }


            }

    //la deuxième méthode .  

            public object getPage(int codeProjet, int racine, bool xml, String parametres)
            {
               
                AsyncCallback ask = new AsyncCallback(test);

                Synchro.BGetPageProxy(codeProjet, racine, xml, parametres, ask);

                return data;
               
            
            }

        }

    mercredi 3 août 2011 13:57

Toutes les réponses

  • L'idée serait que tu réécrives ton code pour prendre en compte l'asynchronisme (par exemple, ne pas appeler la methode getPage par toi-même mais en callback de la première méthode par exemple

     

    Ceci dit tu peux faire cela si tu préfères ainsi : 

     

     public class GetMethods
      {
        
        object data=null;
        Synchro Synchro = new Synchro();
    
    bool IsPassed=false;
     
    
    //la première methode .   
         void test(IAsyncResult result)
        {
          
          try
          {
            
            data = Synchro.EGetPageProxy(result);
    
            System.Diagnostics.Debug.WriteLine("data = " + data);
          }
          catch (Exception ex)
          {
            // handle the exception 
          }
    
    IsPassed=true;
        }
    
    //la deuxième méthode .  
    
        public object getPage(int codeProjet, int racine, bool xml, String parametres)
        {
    while(!IsPassed)
         Thread.Sleep(20); //attention de ne pas être dans le thread UI
      
          AsyncCallback ask = new AsyncCallback(test);
    
          Synchro.BGetPageProxy(codeProjet, racine, xml, parametres, ask);
    
          return data;
          
         
        }
    
      }
    
    



    S'il vous plaît n'oublier pas de marquer la ou les réponses qui aident à résoudre votre problème. Pour que la discussion puisse être marquée comme résolue
    mercredi 3 août 2011 14:17
  • J'ai essaye ta réponse mais sa bloque aucun résultat n'est retourne :(
    mercredi 3 août 2011 14:23
  • Pourtant la seule facon d'accéder à getPage c'est d'avoir IsPassed à vrai, ce qui signifie que tu es passé dans la fonction test car c'est le seul endroit ou on affecte la valeur

    verifie que tu passes bien dans la méthode test déjà avec un point d'arrêt


    S'il vous plaît n'oublier pas de marquer la ou les réponses qui aident à résoudre votre problème. Pour que la discussion puisse être marquée comme résolue
    mercredi 3 août 2011 14:30
  • oui le problème que j'ai c'est que j'ai toujours ispassed a false  ?? je ne sais pas pourquoi ?

     

     

    Cordialement,Sara.

    mercredi 3 août 2011 14:34
  • Avec le point d'arrêt, tu passes bien par IsPassed=true ?

     

    Si oui, vérifie que tu n'as pas deux instances différentes du même type d'objet


    S'il vous plaît n'oublier pas de marquer la ou les réponses qui aident à résoudre votre problème. Pour que la discussion puisse être marquée comme résolue
    mercredi 3 août 2011 14:39
  • oui ispassed = true au niveau de la methode test 

    quand je mets la boucle while au niveau de la methode getPage , le programme ne rentre pas dans la méthode test est il reste toujours false ??

     

    Cordialement,Sara.

    mercredi 3 août 2011 14:53
  • La seule possibilité c'est que ton c'est deux objets différents, si tu veux tester, mets un point d'arrêt dans la première méthode :

     

    et dans la partie "locals" (ou espion), selectionne this et fait clic droit "Object Id"

     

    un #1 va alors s'ajouter dans la colonne "value"

     

    met un point d'arrete dans la seconde méthode et vérifie this, je te parie que tu n'auras pas le #1, ce qui signifie que ce n'est pas la meme instance


    S'il vous plaît n'oublier pas de marquer la ou les réponses qui aident à résoudre votre problème. Pour que la discussion puisse être marquée comme résolue
    mercredi 3 août 2011 15:08
  • Oui se fais et j'ai trouve la #1 dans la méthode test !!!!
    mercredi 3 août 2011 15:32
  • ca c'est que le début, normalement, dans la méthode getPage tu devrais retrouver le même #1 (sans rien faire), si ce n'est pas le cas, ce n'est pas le même objet
    S'il vous plaît n'oublier pas de marquer la ou les réponses qui aident à résoudre votre problème. Pour que la discussion puisse être marquée comme résolue
    mercredi 3 août 2011 15:37
  • oui j'ai le meme #1 ??


    Cordialement,Sara.
    mercredi 3 août 2011 15:58
  • Donc tu as le même objet, avec un IsPassed qui passe à faux comme ca sans qu'on lui demande.... etrange
    S'il vous plaît n'oublier pas de marquer la ou les réponses qui aident à résoudre votre problème. Pour que la discussion puisse être marquée comme résolue
    mercredi 3 août 2011 16:09
  • Oui la veriter j'ai beaucoup chercher mais j'ai pas trouver l'erreur :(

    Cordialement,Sara.
    mercredi 3 août 2011 16:14
  • Bonjour,

    Avez vous trouvé une solution ? Merci de partager avec nous les résultats,afin que d'autres personnes avec le même problème puissent profiter de cette solution.


    Cordialement, Pascal.

    Développeur Wpf/SilverLight/WinPhone7

    jeudi 4 août 2011 17:50
  • Bonjour,

     

    non je n'ai pas encore trouve la solution .

     

    Cordialement,Sara.

     

    vendredi 5 août 2011 10:18
  • Bonjour,

     

    D'après ce code si je ne me trompe pas :

    public class GetMethods
     {
      
      object data=null;
      Synchro Synchro = new Synchro();
    
    bool IsPassed=false;
     
    
    //la première methode .  
       void test(IAsyncResult result)
      {
       
       try
       {
        
        data = Synchro.EGetPageProxy(result);
    
        System.Diagnostics.Debug.WriteLine("data = " + data);
       }
       catch (Exception ex)
       {
        // handle the exception 
       }
    
    IsPassed=true;
      }
    
    //la deuxième méthode . 
    
      public object getPage(int codeProjet, int racine, bool xml, String parametres)
      {
    while(!IsPassed)
       Thread.Sleep(20); //attention de ne pas être dans le thread UI
     
       AsyncCallback ask = new AsyncCallback(test);
    
       Synchro.BGetPageProxy(codeProjet, racine, xml, parametres, ask);
    
       return data;
       
       
      }
    
     }
    
    

    Vous ne passerez jamais dans la 1ère méthode car c'est la 1ère méthode qui met IsPassed = true.

    Donc IsPassed sera toujours à false et la 1ère méthode ne sera jamais appeler.

    Du moins c'est ce que je comprend en regardant le code.


    Cordialement, Pascal.

    Développeur Wpf/SilverLight/WinPhone7

    vendredi 5 août 2011 19:07
  • Si j'ai bien compris le résultat attendu est plutôt celui ci :

     

    public class GetMethods
     {
     
     object data=null;
     Synchro Synchro = new Synchro();
    
    bool IsPassed=false;
     
    
    //la première methode . 
      void test(IAsyncResult result)
     {
      
      try
      {
      
      data = Synchro.EGetPageProxy(result);
    
      System.Diagnostics.Debug.WriteLine("data = " + data);
      }
      catch (Exception ex)
      {
      // handle the exception 
      }
    
    IsPassed=true;
     }
    
    //la deuxième méthode . 
    
     public object getPage(int codeProjet, int racine, bool xml, String parametres)
     {
    
     
      AsyncCallback ask = new AsyncCallback(test);
    
    while(!IsPassed)
      Thread.Sleep(20); //attention de ne pas être dans le thread UI
    
      Synchro.BGetPageProxy(codeProjet, racine, xml, parametres, ask);
    
      return data;
      
      
     }
    
     }
    
    


    Cordialement, Pascal.

    Développeur Wpf/SilverLight/WinPhone7

    vendredi 5 août 2011 20:00
  • En fait, j'avais lu le code un poil trop vite (faut essayer de nommer ses variables de facon plus explicite sarita;) et j'ai été perturbé par le fait qu'en mettant un point d'arret il passait bien dans test.

     

    Comme pascal l'a exprimé implicitement, la boucle while est mal placé mais dans sa réponse, elle est toujours mal placé ;)

     

     

    Voici le code correct :

    public class GetMethods
     {
     
     object data=null;
     Synchro Synchro = new Synchro();
    
    bool IsPassed=false;
     
    
    //la première methode . 
     void test(IAsyncResult result)
     {
     
     try
     {
     
     data = Synchro.EGetPageProxy(result);
    
     System.Diagnostics.Debug.WriteLine("data = " + data);
     }
     catch (Exception ex)
     {
     // handle the exception 
     }
    
    IsPassed=true;
     }
    
    //la deuxième méthode . 
    
     public object getPage(int codeProjet, int racine, bool xml, String parametres)
     {
    
     
     var callback = new AsyncCallback(test);
    //on initialise la callback
    
    Synchro.BGetPageProxy(codeProjet, racine, xml, parametres, callback);
    //on appelle la methode qui elle appelera la callback
    
    //enfin on attend que la callback soit appelée
    while(!IsPassed)
     Thread.Sleep(20); //attention de ne pas être dans le thread UI
    
     
    
     return data;
     
     
     }
    
     }
    
    


     


    S'il vous plaît n'oublier pas de marquer la ou les réponses qui aident à résoudre votre problème. Pour que la discussion puisse être marquée comme résolue
    vendredi 5 août 2011 21:36
  • Oui Rudy à raison, par contre je connais pas la classe Synchro, je vais regarder sur Msdn à quoi sa correspond :)

    Donc Sara avec la réponse de Rudy il ne devrait y avoir aucun problème.


    Cordialement, Pascal.

    Développeur Wpf/SilverLight/WinPhone7

    samedi 6 août 2011 06:15
  • vu le nom des methodes : BPageGetProxy, EGetPageProxy, ca doit etre un service web importé ou une classe perso ;)
    S'il vous plaît n'oublier pas de marquer la ou les réponses qui aident à résoudre votre problème. Pour que la discussion puisse être marquée comme résolue
    samedi 6 août 2011 09:41
  • Bonjour,

    Est-ce que vous avez testé la solution proposée ? Merci de partager avec nous les résultats,afin que d'autres personnes avec le même problème puissent profiter de cette solution.


    Cordialement, Pascal.

    Développeur Wpf/SilverLight/WinPhone7

    dimanche 7 août 2011 09:50
  • Bonjour,

    merci pour votre aide ,j'ai essaye la reponse de rudy mais j'ai deja essayer cette solution sa marche pas , sa bloque tous le traitement .

     

    Cordialement,Sara.

    lundi 8 août 2011 09:59
  • Voici le details de tous mon programme

     

    j'ai une class Synchro dont j'ai des methodes qui font des appels au serveur xmlrpc :

     


        [XmlRpcUrl("http://")]
        public class Synchro:XmlRpcClientProtocol
        {
            [XmlRpcBegin("service.getRichSession")]
            public IAsyncResult BGetRichSession(int codeProjet, String useragent, XmlRpcStruct properties, String lastUpdate, AsyncCallback acb)
            {
                return this.BeginInvoke(MethodBase.GetCurrentMethod(), new object[] { codeProjet, useragent, properties, lastUpdate }, acb, null);
            }

            [XmlRpcEnd]
            public object EGetRichSession(IAsyncResult iasr)
            {
                object obj = this.EndInvoke(iasr);
                return obj;

            }


            [XmlRpcBegin("service.getPageJson")]
            public IAsyncResult BGetPageProxy(int codeProjet, int racine, bool xml, String parametres, AsyncCallback acb)
            {
                return this.BeginInvoke(MethodBase.GetCurrentMethod(), new object[] { codeProjet, racine, xml, parametres }, acb, null);
               
            }
            [XmlRpcEnd]
            public object EGetPageProxy(IAsyncResult iasr)
            {
                object obj = this.EndInvoke(iasr);
              
                return obj;
            }

            [XmlRpcBegin("service.getStyle")]
            public IAsyncResult BGetStyleProxy(int m, bool b, AsyncCallback acb)
            {
                return this.BeginInvoke(MethodBase.GetCurrentMethod(), new object[] { m, b }, acb, null);
            }
            [XmlRpcEnd]
            public object EGetStyleProxy(IAsyncResult iasr)
            {
                object obj = this.EndInvoke(iasr);
                return obj;
            }


        }
    }

     

    puis pour appeler ces methodes il faut le faire de la manière suivante :

     

     Synchro.BGetRichSession(1627, "", new XmlRpcStruct(), "", asr =>
                {
                    Dispatcher.BeginInvoke(delegate()
                    {
                        try
                        {



                            System.Diagnostics.Debug.WriteLine(" count session cat = " + ((XmlRpcStruct)Synchro.EGetRichSession(asr)).Count);

                        }
                        catch (XmlRpcFaultException fex)
                        {
                            System.Diagnostics.Debug.WriteLine("error page 1 + " + fex.Message);
                        }
                        catch (Exception ex)
                        {
                            System.Diagnostics.Debug.WriteLine("error page 2 + " + ex.Message);
                        }
                    });
                });

    afin d'éviter de faire tous ce traitement pour appele une seule méthodes j'ai créer la class getMethodes  :

     

     


        public class GetMethods
        {
           
            object data=null;
            Synchro Synchro = new Synchro();
            bool IsPassed = false;

        
             void test(IAsyncResult result)
            {
              
                try
                {
                   
                  
                    data = Synchro.EGetPageProxy(result);

                    System.Diagnostics.Debug.WriteLine("data = " + data);
                }
                catch (Exception ex)
                {
                    // handle the exception
                }
                IsPassed = true;
       


            }

            public object getPage(int codeProjet, int racine, bool xml, String parametres)
            {
              
             

                AsyncCallback ask = new AsyncCallback(test);
             
                Synchro.BGetPageProxy(codeProjet, racine, xml, parametres, ask);

               
                return data;

               
            
            }

        }
    }

    et donc c'est dans la méthodes getPage que j'ai le pb elle s'exécute avant qu'elle recoit le résultats de test ?????

     

     

    Cordialement,Sara.

     

    lundi 8 août 2011 10:07
  • Bonjour,

    Attention, j'ai redonné une solution plus loin avec une toute petite nuance, la boucle était plus loin :

    public class GetMethods
     {
     
     object data=null;
     Synchro Synchro = new Synchro();
    
    bool IsPassed=false;
     
    
    //la première methode . 
     void test(IAsyncResult result)
     {
     
     try
     {
     
     data = Synchro.EGetPageProxy(result);
    
     System.Diagnostics.Debug.WriteLine("data = " + data);
     }
     catch (Exception ex)
     {
     // handle the exception 
     }
    
    IsPassed=true;
     }
    
    //la deuxième méthode . 
    
     public object getPage(int codeProjet, int racine, bool xml, String parametres)
     {
    
     
     var callback = new AsyncCallback(test);
    //on initialise la callback
    
    Synchro.BGetPageProxy(codeProjet, racine, xml, parametres, callback);
    //on appelle la methode qui elle appelera la callback
    
    //enfin on attend que la callback soit appelée
    while(!IsPassed)
     Thread.Sleep(20); //attention de ne pas être dans le thread UI
    
     
    
     return data;
     
     
     }
    
     }
    
    

    C'est ce code que tu as essayé ?(avec le while juste avant le return data)

    S'il vous plaît n'oublier pas de marquer la ou les réponses qui aident à résoudre votre problème. Pour que la discussion puisse être marquée comme résolue
    lundi 8 août 2011 13:30
  • ouii ....

     

    Cordialement,Sara.

    lundi 8 août 2011 13:46
  • Etrange !

     

    De toute facon faire du synchrone sous Windows Phone est une grosse erreur. Voici comment je vois le truc :

     

     

     

      public void GetPageProxy(int codeProjet, int racine, bool xml, String parametres, Action<object> callback)
      {
       var iar = this.BeginInvoke(MethodBase.GetCurrentMethod(), new object[] { codeProjet, racine, xml, parametres }, new AsyncCallback(()=>
    {
    var obj=this.EndInvoke(iasr);
       if(callback!=null)
     callback(obj);
    
    
    
    }), null);
    
    }

     


    Ta méthode GetPageProxy est ainsi totalement asynchrone, callback sera appelé avec l'objet resultat après

     

    Voila comment l'utiliser :

     

    Synchro.GetPageProxy(codeProjet, racine, xml, parametres, (res)=>
    {
    
    FaireUnTruc(res); 
    
    
    });
    


     

     


    S'il vous plaît n'oublier pas de marquer la ou les réponses qui aident à résoudre votre problème. Pour que la discussion puisse être marquée comme résolue
    lundi 8 août 2011 15:29
  • Bonjour,

    ce n'est pas du synchrone mais c'est un  asynchronous Delegate 

    la methode getPageProxy et getRichsession et getStyle se base sur un delegate et l'interface IAsyncResult  

    au niveau de la documentation j'ai trouve que si on veut appelé ces méthodes on dois toujours appelé

    BeginInvoke et mettre un bloc try/catch

    pouvais vous me dire comment je peut tous simplement appelé ces méthodes de la manière suivante :


    par exemple : getPageJson(1627, -1, true, string.Empty); d'une manière classique sans passer par BeginInvoke ????

     

    Cordialement,Sara.

    mardi 9 août 2011 10:46
  • Ce que tu veux faire reste du synchrone, tu veux qu'a la sortie de ta méthode tu puisses avoir le résultat. Même si c'est des méthodes asynchrone que tu appelles dedans, le simple fait d'ajouter une boucle while la rend synchrone.

     

    Essaie ma méthode précédente ;)


    S'il vous plaît n'oublier pas de marquer la ou les réponses qui aident à résoudre votre problème. Pour que la discussion puisse être marquée comme résolue
    mardi 9 août 2011 14:05
  • Bonjour,

    Est-ce que vous avez testé la solution proposée ? Merci de partager avec nous les résultats,afin que d'autres personnes avec le même problème puissent profiter de cette solution.


    Cordialement, Pascal.

    Développeur Wpf/SilverLight/WinPhone7

    mercredi 10 août 2011 11:28
  • Bonjour,

     

     

    pour votre solution :

     

     public void GetPageProxy(int codeProjet, int racine, bool xml, String parametres, Action<object> callback)
    {
    var iar = this.BeginInvoke(MethodBase.GetCurrentMethod(), new object[] { codeProjet, racine, xml, parametres }, new AsyncCallback(()=>
    {
    var obj=this.EndInvoke(iasr); // iasr d'ou vous l'avez déclarer quand le la remplace par iar elle ne la reconnais pas .
    if(callback!=null)
    callback(obj);



    }), null);


    Cordialement,Sara.



    }
    jeudi 11 août 2011 11:57
  • ok c'est donc ma réponse précédente, je te laisse la marquer comme réponse pour aider les prochains visiteurs
    S'il vous plaît n'oublier pas de marquer la ou les réponses qui aident à résoudre votre problème. Pour que la discussion puisse être marquée comme résolue
    jeudi 11 août 2011 13:31
  • Vous n'avez pas compri ma questions :

     

     iasr d'ou vous l'avez déclarer quand le la remplace par iar elle ne la reconnais pas . 


    j'ai essayer votre solution mais il y a des erreurs .


    Cordialement,Sara.



    jeudi 11 août 2011 13:33
  •  public void GetPageProxy(int codeProjet, int racine, bool xml, String parametres, Action<object> callback)
    {
    var iar = this.BeginInvoke(MethodBase.GetCurrentMethod(), new object[] { codeProjet, racine, xml, parametres }, new AsyncCallback(()=>
    {
    var obj=this.EndInvoke(iar); // iasr d'ou vous l'avez déclarer quand le la remplace par iar elle ne la reconnais pas .
    if(callback!=null)
    callback(obj);



    }), null);

    juste un S en trop...

    S'il vous plaît n'oublier pas de marquer la ou les réponses qui aident à résoudre votre problème. Pour que la discussion puisse être marquée comme résolue
    jeudi 11 août 2011 16:00
  • Bonjour,

     

    j'ai essaye iar mais sa marche pas , svp vous pouvez me donner le code exacte .

     

    Cordialement,Sara.

     

    jeudi 11 août 2011 16:30
  • Oui en effet, iar ne peut être utilisé pendant sa création (erreur de débutant)

     

    public void GetPageProxy(int codeProjet, int racine, bool xml, String parametres, Action<object> callback)
     {
     this.BeginInvoke(MethodBase.GetCurrentMethod(), new object[] { codeProjet, racine, xml, parametres }, new AsyncCallback((iar)=>
    {
    var obj=this.EndInvoke(iar);
     if(callback!=null)
     callback(obj);
    
    
    
    }), null);
    



    S'il vous plaît n'oublier pas de marquer la ou les réponses qui aident à résoudre votre problème. Pour que la discussion puisse être marquée comme résolue
    jeudi 11 août 2011 23:24
  • Bonjour,

     

    j'ai teste votre solution mais  sa renvoi aucun résultats :(

    Cordialement,Sara.

     

    vendredi 12 août 2011 10:02
  • C'est normal vu que l'on est asynchrone, je n'ai fait que regrouper tes commandes dans une seule et meme méthode asynchrone, voici comment l'utiliser

     

     

    GetPageProxy(40,10, true, "mon param",(result)=>
    {
    
    //Ce bout de code sera executé après que les 2 appels aient été fait, result contient l'objet résultat
    Deployment.Current.Dispatcher.BeginInvoke(()=>{
    MessageBox.Show(result.ToString());
    });
    
    
    });
    
    //Ce bout de code sera executé après l'appel à GetPageProxy, le résultat arrivera plus tard dans la partie précédente
    


     

    S'il vous plaît n'oublier pas de marquer la ou les réponses qui aident à résoudre votre problème. Pour que la discussion puisse être marquée comme résolue

    vendredi 12 août 2011 13:26
  • Bonjour,

     

    je veux marquer la réponse mais je ne trouve pas ya que le choix de reponse , citation , modifier???

     

     

    Cordialement,Sara.
    lundi 15 août 2011 12:21
  • Bonjour,

    c'est normal la discussion à été transformer de question en discussion générale.

    Je pense qu'il faut voir avec un modérateur pour transformer de nouveau ton post en Question.


    Cordialement, Pascal.

    Développeur Wpf/SilverLight/WinPhone7

    lundi 15 août 2011 12:33