Partage
  • Partager sur Facebook
  • Partager sur Twitter

Redirection asynchrone d'un processus externe C#

    22 juin 2017 à 10:02:13

    Bonjour,

    Je dois lancer un processus sur un serveur Linux à partir de mon programme C# et récupérer la sortie de ce dernier dans une listBox.

    Pour l'instant, j'ai réalisé la redirection de manière synchrone.

    Néanmoins si le processus est long en traitement, il faut attendre que ce dernier se termine afin de récupérer la sortie finale.

    Pour remédier à ce problème, je souhaiterai implémenter la même tâche de manière asynchrone.

    Je précise que :

    - Je me connecte en SSH sur le serveur Linux pour réaliser ces opérations.

    - Mon processus est un processus Python.

    Je vous remercie par avance.

    using (var client = new SshClient(sshServerHost, sshServerId, sshServerPassword))
                        try
                        {
                            client.Connect();
                            MessageBox.Show("Connexion réussie à " + client.ConnectionInfo.Host + " !", "Connexion SSH ", MessageBoxButtons.OK, MessageBoxIcon.Information);
                            
                             /* Lancement du processus avec les arguments communiqués
                             * Par défaut, la session SSH se postionne sur le répertoire utilisateur */
                            SshCommand command = client.RunCommand("cd / && cd" + " " + fileDirectoryOnServer + " && python" + " " + file + " " + argFinal);
    
                            /* Redirection synchrone des résultats dans la console
                             * Ajout simple */
                            string[] results = command.Result.Split('\n');
                            foreach (var result in results)
                            {
                                console.Items.Add(result);
    
                                //Autoscroll de la console 
                                console.SelectedIndex = console.Items.Count - 1;
                            }
                        }
                        catch (Exception)
                        {
                            MessageBox.Show("Impossible d'atteindre le serveur. Veuillez vérifier les données saisies pour établir la connection.", "Erreur connexion SSH", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        }
                        finally
                        {
                            client.Disconnect();
                            client.Dispose();
                        }
                    }
    
    

    -
    Edité par Arnooold 22 juin 2017 à 10:03:47

    • Partager sur Facebook
    • Partager sur Twitter
      22 juin 2017 à 20:13:37

      Hello,

      Je suppose que tu utilises SshNet, il faut utiliser la méthode "BeginExecute(...)" sur ta SshCommand pour pouvoir utiliser l'asynchronisme.

      Ensuite, tu as juste à spécifier la callback dans l'appel de la méthode.

      • Partager sur Facebook
      • Partager sur Twitter
      Si un message vous a aidé, n'oubliez pas le +1 et de passer votre sujet en "Résolu" ! :)
        26 juin 2017 à 10:10:16

        Bonjour Pyrobolser,

        Peux-tu me donner un exemple s'il te plait. Je ne vois pas la spécification du callback.

        Merci à toi ! =)

        • Partager sur Facebook
        • Partager sur Twitter
          26 juin 2017 à 19:07:47

          J'avoue que la doc de l'API est pas franchement romanesque.

          Exemple : 

          using static System.Console;
          using Renci.SshNet;
          
          namespace ConsoleSandbox
          {
              public class Program
              {
                  private static void WaitForIt()
                  {
                      Write(".");
                  }
          
                  public static void Main(string[] args)
                  {
                     using (var client = new SshClient("***", "***", "***"))
                      {
                          client.Connect();
                          var command = client.CreateCommand("pwd");
                          var result = command.BeginExecute();
                          WriteLine("Execute command...");
          
                          while (!result.IsCompleted)
                          {
                              WaitForIt();
                          }
          
                          WriteLine();
                          WriteLine($"Command result: { command.Result }");
                      }
                  }
              }
          }



          • Partager sur Facebook
          • Partager sur Twitter
          Si un message vous a aidé, n'oubliez pas le +1 et de passer votre sujet en "Résolu" ! :)

          Redirection asynchrone d'un processus externe C#

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown