2009-12-15 9 views
2

Je crée un petit client qui finira par se connecter à un serveur pour recueillir des informations sur les jeux disponibles, le nombre de joueurs et toutes sortes d'autres choses que vous pouvez imaginer. Mes difficultés à trouver un moyen efficace de gérer la séquence de connexion/réessai lors de la première mise en service.Le moyen le plus efficace de se connecter/réessayer de se connecter en utilisant C#?

J'imaginaient mon client suivrait ce processus en essayant de se connecter:

  1. application client exécutée
  2. Essayez d'établir une connexion
  3. Si la connexion réussie de recueillir des informations - Si procéder ne réussit pas à l'étape 4
  4. Afficher un nouveau dialogue/formulaire qui invite l'utilisateur à établir une connexion
  5. Boucle jusqu'à ce qu'une connexion soit établie

J'ai remis en question mes méthodes en essayant de suivre cette séquence. Je me demande si c'est la bonne/la manière la plus efficace de se connecter ainsi que pourquoi mon formulaire que je montre à l'étape 4 ne fonctionne pas?

try 
{ 
    sock.Connect(authenServerEP); 
    // Once connected show our main client window 
    this.Show(); 
    // Create the LoginForm once a connection has been established and display 
    LoginForm loginForm = new LoginForm(); 
    loginForm.ShowDialog(); 
    if (false == loginForm.Visible) 
    { 
     loginForm.Dispose(); 
    } 
} 
catch (SocketException firstConnectException) 
{ 
    // Load retrying connection form 
    EstablishingConnectionForm establishingConnectionForm = new EstablishingConnectionForm();         
    establishingConnectionForm.Show(); 

    bool connected = false; 
    // Loop until we are connected 
    while (!connected) 
    { 
     try 
     { 
      sock.Connect(authenServerEP); 
      connected = true; 
      establishingConnectionForm.Dispose(); 
     } 
     catch (SocketException retryConnectException) 
     { 
      // Pass and retry connection 
     } 
    } 
} // end catch (SocketException firstConnectException) 

Comme vous pouvez le voir, je suis attrapant le SocketException qui se pose quand il y a un problème de connexion au serveur (tel que le serveur ne fonctionne pas). Je continue ensuite à essayer de boucle en boucle jusqu'à ce qu'une connexion soit établie. Je ne sais pas si je devrais le faire de cette façon. Y a-t-il de meilleurs moyens de le faire?

De même quand j'affirme establishConnectionForm avec Show() il ne semble pas que tous les formulaires/outils initialisent (l'initialisation pourrait être trompeuse). L'étiquette qui se trouve sur le formulaire est simplement masquée en blanc au lieu d'afficher son texte. Non seulement cela, mais il semble que je ne peux pas sélectionner le formulaire/dialogue et le déplacer réellement. Il se trouve là avec l'icône de la souris "Penser/Travailler". Maintenant, je suppose que c'est parce que je suis en train d'essayer de se reconnecter et son blocage à cause de cela (je peux me tromper sur le blocage?). Ce problème peut-il être résolu avec multithreading? Si oui, dois-je multithread? Existe-t-il un moyen plus simple de montrer ma forme/boîte de dialogue et de pouvoir interagir (IE le filmer et le fermer avec le 'X' dans le coin supérieur droit) pendant que j'essaie toujours de me reconnecter?

Merci beaucoup. J'apprécie vraiment que vous lisiez cet article et je suis reconnaissant pour cette communauté. : D

Répondre

4

Juste un exemple ci-dessous où je gérerais toute logique de continuation dans le catch et soit éclater ou continuer à l'intérieur de la boucle while.

Andrew

while (!connected) 
{ 
    try 
    { 
     sock.Connect(authenServerEP); 
     connected = true; 
     establishingConnectionForm.Dispose(); 
    } 
    catch (SocketException retryConnectException) 
    { 
     //Optional - add some wait time may be 5 seconds i.e. "trying again in 5 seconds" 
     //System.Threading.Thread.Sleep(5000); 
     //Here check the number of attempts and if exceeded: 
     if(numberOfTimes == 5) 
     { 
      break; 
     } 
     else 
     { 
      numberOfTimes++; 
      continue; 
     } 
    } 
} 
+1

Je seconde cette réponse. Il suit en fait ce que l'on appelle le modèle de disjoncteur. Tenter quelque chose jusqu'à ce que certaines conditions se produisent ou qu'un seuil soit atteint. C'est très pratique lorsqu'il s'agit de connexions externes sur lesquelles vous n'avez aucun contrôle. –

+0

Cela a fonctionné à merveille. J'apprécie ton aide. La seule chose qui me reste à faire est le fait qu'il semble que lorsque j'apporte ma establishConnectionForm quand j'attrape la SocketException, je ne peux jamais interagir avec elle. Il montre toujours l'icône de la pensée et ne me laisse jamais le sélectionner et le déplacer. Maintenant, je suppose que c'est parce que je suis en train d'essayer de se reconnecter et son blocage à cause de cela (je peux me tromper sur le blocage?). Est-ce un problème de treahing?(IE toute connexion doit être effectuée sur les threads afin que cette connexion ne bloque pas - si elle bloque?) – Chris

+0

Oui la boucle while provoquera le blocage sur le thread sur lequel il est. Le lancer sur un fil séparé et lancer des événements pour informer les entités d'écoute des statuts mis à jour! –