Наиболее эффективный способ подключения / повторного подключения с использованием C #? - PullRequest
2 голосов
/ 15 декабря 2009

Я создаю небольшой игровой клиент, который в конечном итоге подключится к серверу, чтобы собрать некоторую информацию о доступных играх, в которые они играют, сколько игроков играют и все другие вещи, которые вы можете себе представить.

Мои трудности связаны с поиском эффективного способа обработки последовательности подключения / повторного подключения при первой загрузке.

Я предполагал, что мой клиент будет следовать этому процессу при попытке подключения:

  1. Выполнено клиентское приложение
  2. Попробуйте установить соединение
  3. Если соединение установлено успешно, собрать информацию - Если не удалось, перейдите к шагу 4
  4. Отображение нового диалогового окна / формы, в которой пользователю предлагается установить соединение
  5. Цикл до установления соединения

Я подверг сомнению мои методы, пытаясь следовать этой последовательности. Я спрашиваю, является ли это правильным / наиболее эффективным способом подключения, а также почему моя форма, отображаемая на шаге 4, не работает?

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)   

Как видите, я ловлю исключение SocketException, возникающее при возникновении проблемы с подключением к серверу (например, если сервер не работает). Затем я продолжаю пытаться непрерывно зацикливаться, пока соединение не будет установлено. Я не знаю, должен ли я делать это таким образом. Есть ли лучшие способы сделать это?

Также, когда я показываю установлениеConnectionForm с помощью Show (), это не похоже на инициализацию всех форм / инструментов (инициализация может вводить в заблуждение). Ярлык, который находится на форме, просто закрашен белым, в отличие от отображения текста. Не только это, но кажется, что я не могу выбрать форму / диалог и фактически переместить его. Он сидит там со значком мыши «Мышление / Работать». Теперь я предполагаю, что это потому, что я зацикливаюсь, пытаясь восстановить соединение и его блокировку из-за этого (я мог ошибаться в блокировке?). Можно ли решить эту проблему с помощью многопоточности? Если да, то мне нужно многопоточность? Есть ли более простой способ показать мою форму / диалоговое окно и иметь возможность взаимодействовать (например, обвести его вокруг и закрыть с помощью «X» в верхнем правом углу), пока я все еще пытаюсь восстановить соединение?

Спасибо большое. Я очень ценю, что вы читаете этот пост, и благодарен за это сообщество. : D

1 Ответ

4 голосов
/ 15 декабря 2009

Просто пример ниже, где я бы обработал любую логику продолжения в улове и либо вышел из строя, либо продолжил внутри цикла 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;
        }
    }
}
...