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

Posted

技术标签:

【中文标题】使用 C# 连接/重试连接的最有效方法?【英文标题】:Most effective way to connect/retry connecting using C#? 【发布时间】:2009-12-15 06:52:55 【问题描述】:

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

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

我想我的客户会按照这个过程尝试连接:

    已执行客户端应用程序 尝试建立连接 如果连接成功收集信息 - 如果不成功,请继续执行步骤 4 显示一个新的对话框/表单,提示用户正在尝试建立连接 循环直到建立连接

我一直在质疑我试图遵循这个顺序的方法。我质疑这是否是正确/最有效的连接方式,以及为什么我在第 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。然后我继续尝试不断循环,直到建立连接。我不知道我是否应该这样做。有没有更好的方法来做到这一点?

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

非常感谢。我非常感谢您阅读这篇文章,并感谢这个社区。 :D

【问题讨论】:

【参考方案1】:

下面只是一个示例,我将在 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;
        
    

【讨论】:

我支持这个答案。它实际上遵循所谓的断路器模式。尝试某事,直到某些条件发生或达到阈值。在处理您无法控制的外部连接时非常方便。 这非常有效。我感谢您的帮助。我要处理的一件事是,当我在捕获 SocketException 时调出建立连接表单时,我似乎永远无法与之交互。它总是显示思考图标,从不让我选择它并移动它。现在我认为这是因为我正在循环尝试重新连接并因此而阻塞(我的阻塞可能是错误的?)。这是一个处理问题吗? (IE 所有连接都应该在线程上完成,这样连接就不会阻塞 - 如果它阻塞了?) 是的,while 循环会导致它所在的线程阻塞。在单独的线程上启动它并启动事件以通知监听实体更新状态!

以上是关于使用 C# 连接/重试连接的最有效方法?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Serverless Aurora 时 Sequelize 连接超时,寻找增加超时持续时间或重试连接的方法

Robot Framework Telnet 连接重试

重试时客户端连接未正确关闭

在 Java 中重试 JDBC 连接

pyngrok - 重试失败的连接

Nacos Config连接超时重试