使用 C# 连接/重试连接的最有效方法?

Chr*_*ris 2 .net c# network-programming winsock

我正在创建一个小游戏客户端,它将最终连接到服务器以收集有关可用游戏的一些信息,有多少玩家正在玩,以及您可以想象它应该做的各种其他事情。

我的困难在于找到一种有效的方法来处理首次加载时的连接/重试连接序列。

我想象我的客户在尝试连接时会遵循这个过程:

  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)   
Run Code Online (Sandbox Code Playgroud)

如您所见,我正在捕获连接到服务器出现问题(例如服务器未运行)时引发的 SocketException。然后我继续尝试不断循环直到建立连接。我不知道我是否应该这样做。有没有更好的方法来做到这一点?

此外,当我使用 Show() 显示建立ConnectionForm 时,它看起来不像所有表单/工具都已初始化(初始化可能会产生误导)。表单上的标签只是以白色阴影显示,而不是显示其文本。不仅如此,但似乎我无法选择表单/对话框并实际移动它。它位于那里,带有“思考/工作”鼠标图标。现在我认为这是因为我正在循环尝试重新连接并因此阻塞(我可能在阻塞上错了?)。这个问题可以用多线程解决吗?如果是这样,我需要多线程吗?有没有更简单的方法来显示我的表单/对话框并能够在我仍然尝试重新连接的同时与其进行交互(IE 对其进行拍摄并用右上角的“X”关闭它)?

谢谢一堆。我真的很感谢你阅读这篇文章,并感谢这个社区。:D

REA*_*REW 5

下面是一个示例,我将在其中处理 catch 中的任何延续逻辑,并在 while 循环内中断或继续。

安德鲁

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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)