2009-04-14 7 views
1

J'utilise actuellement un composant tiers pour gérer les connexions Telnet dans .NET. Je veux qu'il soit synchrone où j'envoie une commande au serveur telnet de réception et puis j'obtiens la réponse en tant que tableau de texte ou d'octets. Le seul problème est que le composant n'est pas configuré pour le faire. Le composant me permet d'envoyer des commandes au serveur, mais la réponse est renvoyée via un handle de fonction. Donc, en substance, j'ai besoin d'un moyen de mettre en pause l'application pendant que le gestionnaire fait son traitement. Voici un exemple de la façon dont je l'intention de contourner cette question:Création d'une boucle pour suspendre un script pendant l'exécution d'une fonction de rappel

static void Main(string[] args) 
    { 
     Telnet telCon = new Telnet(); 
     telCon.OnDataIn += new Telnet.OnDataInHandler(HandleDataIn); 
     telCon.Connect(remoteHostStr); 

     while (true) ; 
    } 

    public static void HandleDataIn(object sender, TelnetDataInEventArgs e) 
    { 
     string responseStr = e.Text; 

     if (responseStr.Contains("Username:")) 
     { 
      ((Telnet)sender).Send(System.Text.ASCIIEncoding.ASCII.GetBytes(username)); 
     } 
     else if (responseStr.Contains("Password:")) 
     { 
      ((Telnet)sender).Send(System.Text.ASCIIEncoding.ASCII.GetBytes(password)); 
     } 
    } 

La solution travail ci-dessus ne sera pas puisque le while aura toujours courir, mais je vais probablement construire une future version qui utilise une sorte de variable globale suivre si la boucle doit encore fonctionner. Cependant, tout ce qu'on m'a appris sur la programmation dit que c'est très sale. Quelqu'un peut-il penser à une autre façon de contourner mon dilemme?

Merci, Chris

Répondre

1

Voici un exemple d'utilisation de ManualResetEvent pour suspendre l'exécution (et retarder la fin du programme) jusqu'à ce que votre gestionnaire d'événements dise qu'il est terminé.

static ManualResetEvent finishGate; 

static void Main(string[] args) 
{ 
    finishGate = new ManualResetEvent(false); // initial state unsignaled 

    Telnet telCon = new Telnet(); 
    telCon.OnDataIn += new Telnet.OnDataInHandler(HandleDataIn); 
    telCon.Connect(remoteHostStr); 

    finishGate.WaitOne(); // waits until the gate is signaled 
} 

public static void HandleDataIn(object sender, TelnetDataInEventArgs e) 
{ 
    // handle event 

    if (processingComplete) 
     finishGate.Set(); // signals the gate 
} 

Procédé WaitOne() de ManualResetEvent comprend également les remplacements qui acceptent un laps de temps ou le nombre de millisecondes. Il renvoie bool - true s'il a été signalé, false s'il a expiré. Si vous mettez cela dans une boucle, vous pourriez avoir votre fil principal se réveiller toutes les 30 secondes et effectuer certaines tâches d'entretien ménager, mais toujours avoir une réponse instantanée lorsque la porte est signalée.

0

Votre boucle while:

while(true) ; 

pilotera l'utilisation du processeur à 100% (bien 100% de 1 noyau sur une machine multi-cœurs) et le laisser là, de façon permanente.

Cela va affamer d'autres processus de la puissance du processeur, et peut empêcher le composant Telnet de fonctionner du tout parce que vous avez contourné la pompe de message.

Il existe de meilleurs moyens, mais sans plus d'informations sur ce que vous faites, il sera difficile de vous conseiller.

Pour commencer, voulez-vous une application WindowsForms/WPF/Console?

[Et s'il vous plaît, utilisez les commentaires pour répondre, pas de réponse.]

+0

En tant que test, je cherche à l'utiliser dans une application console. Finalement, il fera partie d'une page ASP.NET, et la sortie du serveur telnet sera écrite dans la réponse de la page. – regex

0

En général, lorsque vous vraiment besoin d'attendre, utilisez un WaitHandle. Dans ce cas, un ManualResetEvent serait probablement ce dont vous avez besoin.

0

Un meilleur moyen serait de générer le traitement Telnet à un autre thread. De cette façon, vous pouvez demander au thread principal d'attendre que le traitement Telnet soit terminé.

Jetez un oeil here pour quelques très bons tutoriels sur le filetage.

Questions connexes