none
Comment demarrer plusieurs HTTPChannel de maniere asynchrone RRS feed

  • Question

  • Bonjour,

     

    Dans le cadre de la refonte d'une partie d'application vieille de 15ans ecrite en C, les contraintes de la partie existantes qui n'est pas a reecrire m'oblige depuis mon application a lancer et arreter dynamiquement plusieurs HTTPChannel en meme temps depuis un service Windows. 

    Tout les exemples que j'ai trouve ont la meme syntaxe : 

    // Create the server channel.

    HttpServerChannel serverChannel = new HttpServerChannel(9090);

    // Register the server channel. ChannelServices.RegisterChannel(serverChannel);

    // Expose an object for remote calls.

    RemotingConfiguration.RegisterWellKnownServiceType( typeof(RemoteObject), "RemoteObject.rem", WellKnownObjectMode.Singleton);

    // Wait for the user prompt.

    Console.WriteLine("Press ENTER to exit the server.");

    Console.ReadLine();

    Console.WriteLine("The server is exiting.");

     

    Si je retire la ligne Console.ReadLine(), mon serveur ne repond plus au demande faite par les clients.

     

    Existe t'il un moyen de lancer un HTTPChannel de maniere asynchrone ?

     

    Merci de vos reponse.

    jeudi 10 février 2011 08:39

Réponses

  • ou plutôt le faire attendre :

    public class XMLRPCSrv
    {
    
      HttpChannel channel = null;
    
      int port;
    
      Thread thread;
    
      static EventWaitHandle _waitHandleStart = new AutoResetEvent(false);
    
      static EventWaitHandle _waitHandleProcess = new AutoResetEvent(false);
    
      EventWaitHandle _waitHandleStop = new AutoResetEvent(false);
    
      public EventWaitHandle Start() 
      {
        thread = new Thread(new ThreadStart(StartInternal));
    
        thread.Start();
    
        // on bloque le thread courant jusqu'a ce que le serveur RPC soit lance
    
        _waitHandleStart.WaitOne();
    
        return _waitHandleProcess;
      }
    
      public void Stop() 
      {
        _waitHandleStop.Set();
      }
     
    
      public void StartInternal()
      {
        port = 10000;
    
        ListDictionary prop = new ListDictionary();
    
        prop.Add("port", (object)port);
    
        channel = new HttpChannel(prop,
    
            new XmlRpcClientFormatterSinkProvider(null, null),
    
            new XmlRpcServerFormatterSinkProvider(null, null));
    
        ChannelServices.RegisterChannel(channel, false);
    
        RemotingConfiguration.RegisterWellKnownServiceType(typeof(XMLRPCSrvMethods),
    
                    "myApp/anURI",
    
                    WellKnownObjectMode.Singleton);
    
        _waitHandleStart.Set();
    
        // on attend la fin du Thread...
        _waitHandleStop.WaitOne();
      }
    }
    
    
    Cordialement

    • Marqué comme réponse gawa samedi 12 février 2011 06:29
    vendredi 11 février 2011 18:25

Toutes les réponses

  • Bonjour,

    Dans ton exemple le serveur s'arrête puisque tu quitte la portée de déclaration de ton objet HttpServerChannel.

    Si tu base ton application sur un service windows, tu peux créer des variables HttpServerChannel qui seront détruites sur demande ou à défaut lors de l'arrêt du thread.

    Cordialement

    vendredi 11 février 2011 14:36
  • Bonjour.

     

    En fait cet exemple n'est pas mon exemple. Voici donc le mien.

     

    J'ai une classe XMLRPCSrv comme suit : 

     

        public class XMLRPCSrv

        {

            HttpChannel channel = null;

            int port;

            Thread thread;

            static EventWaitHandle _waitHandleStart = new AutoResetEvent(false);

            static EventWaitHandle _waitHandleProcess = new AutoResetEvent(false);

     

            public EventWaitHandle Start() 

       {

                thread = new Thread(new ThreadStart(StartInternal));

                thread.Start();

                // on bloque le thread courant jusqu'a ce que le serveur RPC soit lance

                _waitHandleStart.WaitOne();

                return _waitHandleProcess;

            }

     

            public void StartInternal()

            {

                port = 10000;

                ListDictionary prop = new ListDictionary();

                prop.Add("port", (object)port);

                channel = new HttpChannel(prop,

                                          new XmlRpcClientFormatterSinkProvider(null, null),

                                          new XmlRpcServerFormatterSinkProvider(null, null));

                ChannelServices.RegisterChannel(channel, false);

                RemotingConfiguration.RegisterWellKnownServiceType(typeof(XMLRPCSrvMethods),

                                                                   "myApp/anURI",

                                                                    WellKnownObjectMode.Singleton);

     

                _waitHandleStart.Set();

                Console.WriteLine("Press to shutdown");

                Console.ReadLine();

            }

    }

     

    C'est donc dans un nouveau Thread que mon serveur est lancer. La classe principal instancie XMLRPCSrv puis fait un XMLRPCSrv.Start().

     

    A partir du moment ou je sors de la methode StartInternal, le serveur RPC ne repond plus a mes requetes.

     

    Une idee ?


    vendredi 11 février 2011 15:25
  • Gawa,

    Un Thread reste actif pendant l'exécution de la méthode avec laquelle il a été créée. Une fois la méthode terminée le Thread est également terminé. Du coup si tu voeux garder ton Thread actif tu es obligé de le faire boucler :

     

    public
    
     class
    
     XMLRPCSrv
    {
    
      HttpChannel channel = null
    
    ;
    
      int
    
     port;
    
      Thread thread;
    
      static
    
     EventWaitHandle _waitHandleStart = new
    
     AutoResetEvent(false
    
    );
    
      static
    
     EventWaitHandle _waitHandleProcess = new
    
     AutoResetEvent(false
    
    );
    
       bool
    
     isRunning = false
    
    ;
    
      public
    
     EventWaitHandle Start() 
      {
        isRunning = true
    
    ;
    
        thread = new
    
     Thread(new
    
     ThreadStart(StartInternal));
    
        thread.Start();
    
        // on bloque le thread courant jusqu'a ce que le serveur RPC soit lance
    
    
    
        _waitHandleStart.WaitOne();
    
        return
    
     _waitHandleProcess;
      }
    
      public
    
     void Stop() 
      {
        isRunning = false
    
    ;
      }
     
    
      public
    
     void
    
     StartInternal()
      {
        port = 10000;
    
        ListDictionary prop = new
    
     ListDictionary();
    
        prop.Add("port"
    
    , (object
    
    )port);
    
        channel = new
    
     HttpChannel(prop,
    
            new
    
     XmlRpcClientFormatterSinkProvider(null
    
    , null
    
    ),
    
            new
    
     XmlRpcServerFormatterSinkProvider(null
    
    , null
    
    ));
    
        ChannelServices.RegisterChannel(channel, false
    
    );
    
        RemotingConfiguration.RegisterWellKnownServiceType(typeof
    
    (XMLRPCSrvMethods),
    
                    "myApp/anURI"
    
    ,
    
                    WellKnownObjectMode.Singleton);
    
        _waitHandleStart.Set();
    
        while
    
    (isRunning)
        {
    
        }
      }
    }
    
    Cordialement

     

    vendredi 11 février 2011 18:17
  • ou plutôt le faire attendre :

    public class XMLRPCSrv
    {
    
      HttpChannel channel = null;
    
      int port;
    
      Thread thread;
    
      static EventWaitHandle _waitHandleStart = new AutoResetEvent(false);
    
      static EventWaitHandle _waitHandleProcess = new AutoResetEvent(false);
    
      EventWaitHandle _waitHandleStop = new AutoResetEvent(false);
    
      public EventWaitHandle Start() 
      {
        thread = new Thread(new ThreadStart(StartInternal));
    
        thread.Start();
    
        // on bloque le thread courant jusqu'a ce que le serveur RPC soit lance
    
        _waitHandleStart.WaitOne();
    
        return _waitHandleProcess;
      }
    
      public void Stop() 
      {
        _waitHandleStop.Set();
      }
     
    
      public void StartInternal()
      {
        port = 10000;
    
        ListDictionary prop = new ListDictionary();
    
        prop.Add("port", (object)port);
    
        channel = new HttpChannel(prop,
    
            new XmlRpcClientFormatterSinkProvider(null, null),
    
            new XmlRpcServerFormatterSinkProvider(null, null));
    
        ChannelServices.RegisterChannel(channel, false);
    
        RemotingConfiguration.RegisterWellKnownServiceType(typeof(XMLRPCSrvMethods),
    
                    "myApp/anURI",
    
                    WellKnownObjectMode.Singleton);
    
        _waitHandleStart.Set();
    
        // on attend la fin du Thread...
        _waitHandleStop.WaitOne();
      }
    }
    
    
    Cordialement

    • Marqué comme réponse gawa samedi 12 février 2011 06:29
    vendredi 11 février 2011 18:25
  • Ca marche.

     

    Merci.

    samedi 12 février 2011 06:30