【问题标题】:Is there something like: Try Until?有没有类似的东西:尝试直到?
【发布时间】:2015-10-20 03:02:02
【问题描述】:

我正在尝试让客户端尝试全部 5 秒来连接到不需要在线的服务器。只有当它在线时它才应该连接。好吧,如果服务器已经在线并且客户端启动,那么消息将毫无问题地发送。但是如果客户端首先启动它会等待一段时间直到超时并停止尝试连接。所以我试图用命令获得一个循环:

Client = New TCPControl2(ip,64555)

我试图这样做:

Try
Client = New TCPControl2(ip, 64555)
Catch ex As Exception
MsgBox(ex.Message)
End Try

我可以在 MsgBox 中输入有关超时的信息,但我不知道如何在连接之前尝试尝试,或者只是设置超时时间,但我也不知道。

Private Client As TCPControl2

【问题讨论】:

  • 我在那里找到了一个不错的解决方案(在 c# 中):C# cleanest way to write retry logic?
  • 该死..我应该慢慢尝试用 C# 编码
  • 翻译到 vb.net 应该不会太难......您可以将其作为答案发布在这里,供其他 vb 开发人员使用。
  • 我翻译累了.. 我的程序翻译错了.. :(

标签: .net vb.net tcp error-handling client


【解决方案1】:

继续尝试直到客户端连接到服务器? 使用while循环怎么样:

while(notConnected)
    Try
        Client = New TCPControl2(ip, 64555)
        notConnected= connectedState!="success"
    Catch ex As Exception
        MsgBox(ex.Message)
    End Try
end while

【讨论】:

  • 试过了,由于某种原因不起作用..我不知道为什么,但我认为我没有被执行。我首先启动了服务器,然后是客户端来检查代码是否正在执行..这不是出于某种原因。
【解决方案2】:

以下代码将尝试连接指定的秒数,如果成功则返回TCPControl2 对象。

Function TryConnect(ByVal ip As String, ByVal port As Integer) As TCPControl2
    While 1 = 1
        Try
            Dim client As New TCPControl2(ip, port)
            Return client
        Catch
        End Try
        Threading.Thread.Sleep(100)
    End While
    Return Nothing
End Function

用法:

    ' -- try to connect.. wait indefinitely
    Client = TryConnect(ip, 64555)
    If Client Is Nothing Then
        MsgBox("Unable to connect! Please check your internet connection.. blah blah.. whatever", MsgBoxStyle.Exclamation)
    Else
        ' you connected successfully.. do whatever you want to do here..
        'Client.WhaeverMethod()
    End If

【讨论】:

  • 感谢您的回答,但这实际上不是我想要的。我正在寻找一段重试直到服务器在线的代码。
【解决方案3】:

在此处找到的 C# 答案的翻译(感谢 @LBushkin):Cleanest way to write retry logic?

我重命名了一些东西以使其对 VB 更友好。如果所有重试都按照 cmets 中的建议失败,我还对其进行了更改以返回发现的第一个异常:

Public Class Retry
    Public Shared Sub Invoke(action As Action, retryInterval As TimeSpan, Optional retryCount As Integer = 3)
        Invoke(Of Object)(Function()
                              action()
                              Return Nothing
                          End Function, retryInterval, retryCount)

    End Sub

    Public Shared Function Invoke(Of T)(action As Func(Of T), retryInterval As TimeSpan, Optional retryCount As Integer = 3) As T
        Dim firstException As Exception = Nothing
        For Retry = 0 To retryCount - 1
            Try
                Return action()
            Catch ex As Exception
                If firstException Is Nothing Then firstException = ex
                Threading.Thread.Sleep(retryInterval)
            End Try
        Next
        Throw firstException
    End Function

End Class

用法:

Retry.Invoke(Sub() SomeSubThatCanFail(), TimeSpan.FromMilliseconds(25))

Dim i = Retry.Invoke(Function() SomeFunctionThatCanFail(), TimeSpan.FromMilliseconds(25))

【讨论】:

    【解决方案4】:

    我认为您想要实现的目标可以通过 do while 循环来完成。你可以在这里阅读更多内容:https://msdn.microsoft.com/en-us/library/eked04a7.aspx

    Dim isConnected As Boolean = false
    Do
       Try
            Client = New TCPControl2(ip, 64555)
            ' Condition changing here.
           if Client.IsConnected = true ' <-- example!
               ' it's connected
               isConnected=true            
           end if
       Catch ex As Exception
            MsgBox(ex.Message)
       End Try
    Loop Until isConnected = true
    

    【讨论】:

    • 非常感谢,它使用此代码:D 谢谢老兄,谢谢
    猜你喜欢
    • 2020-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多