【问题标题】:Detecting wirless network status change in .NET检测 .NET 中的无线网络状态变化
【发布时间】:2015-08-27 06:19:06
【问题描述】:

我使用VB.NET 开发了winform 应用程序。该应用程序部署在连接到无线网络的机器中。机器在车里(移动物体)。

应用程序已将DataGridView 加载了从 MSSQL Server(在远程计算机中)获取的数据。数据每 5 秒刷新一次。

我已经使用NetworkAvailabilityChanged 事件来检测网络状态。如果网络可用,则我从表中检索数据。

代码:

AddHandler NetworkChange.NetworkAvailabilityChanged, AddressOf NetworkStateChangeHandler

Public Sub NetworkStateChangeHandler(ByVal sender As Object, 
                                     ByVal e As NetworkAvailabilityEventArgs)
        If e.IsAvailable = True Then           
            g_bNetworkAlive = True            
        Else           
            g_bNetworkAlive = False
        End If
End Sub

private Sub GetData()
    If g_bNetworkAlive = True
        'code to get the data from table
    End If
End Sub

问题:

如果汽车movers out of the out of the network,则不会触发NetworkAvailabilityChanged 事件。因此它每 5 秒抛出一次以下错误,并且应用程序崩溃。

A network-related or instance-specific error occurred while establishing 
a connection to SQL Server. The server was not found or was not accessible.

临时修复:我每 5 秒向 SQL 服务器机器发出一次Ping 请求,以检测网络状态。它会影响应用程序的性能。

注意:如果我手动关闭 Wifi,NetworkAvailabilityChanged event is fired.只有当汽车离开网络时才会出现问题。

还有其他可行的方案来检测无线网络状态吗?

【问题讨论】:

  • 仅仅因为网络可用,这并不意味着您的代码将能够针对 SQL Server 实现其工作。 唯一 告诉您实际上正在尝试工作并完成工作。您必须编写可以处理的代码,例如无论如何,服务器或网络在您开始工作后 失败。那么,如果您遇到网络故障,是否可以实施退避策略? (它只是失败了。我将等待 5 秒。它再次失败。我将等待 10 秒。它第三次失败,我将等待 2 分钟,等等)
  • 就像@Damien_The_Unbeliever 说的那样,添加任何额外的网络检测逻辑可能毫无意义,因为您必须为数据库连接失败的情况做好准备,所以也许只是基于此编写逻辑?
  • @Damien_The_Unbeliever:感谢您的建议。
  • 网络可能在数据库查询过程中丢失。因此,ping 或尝试检测数据库是否存在有点毫无意义。我会在普通数据库类之上创建一个类并处理任何有关连接丢失的异常。

标签: sql-server vb.net winforms networking wireless


【解决方案1】:

我会简单地使用try..catch,所以如果你得到异常,你可以根据它的id知道代码失败的原因,并决定下一步做什么,最后你可以执行更多的代码而不考虑数据检索与否

Private Sub GetData()
    Try 
        'code to get the data from table

    Catch ex As Exception
        ' Show the exception's message.
        MessageBox.Show(ex.Message)

        ' Show the stack trace, which is a list of methods 
        ' that are currently executing.
        MessageBox.Show("Stack Trace: " & vbCrLf & ex.StackTrace)
    Finally 
        ' This line executes whether or not the exception occurs.
        MessageBox.Show("in Finally block")
    End Try
End Sub

【讨论】:

    【解决方案2】:

    确实有。

    当您可以检查您是否在本地连接到 wifi 时,为什么要向一些虚拟网站发送 http 请求。 使用ManagedWifi API,这将消除您面临的减速问题。

    //Create object at the beginning of your application 
    WlanClient wlanClient = new WlanClient();
    
    
    //You this code to check wifi availability wherever you need
    foreach (WlanInterface _interface in wlanClient.Interfaces)
    {
        If (_interface.CurrentConnection.wlanAssociationAttributes.dot11Ssid.SSID!=null)
       {
          // You are connected to wifi
       }
    }
    

    编辑:如果您没有找到 dll,direct link。只需参考 Dll 和瞧!你完成了。

    【讨论】:

      【解决方案3】:

      你也可以像这样使用 WebRequest 来检查你是否有互联网连接:

      Private Sub GetData()
      
          If HasInternet AndAlso g_bNetworkAlive Then
              'code to get the data from table
          End If
      
      End Sub
      
      Public Shared Function HasInternet As Boolean
      
          Return Not (HttpGet("http://www.google.com/") = "Error")
      
      End Function
      
      Public Shared Function HttpGet(url As String) As String
          Dim request As WebRequest = WebRequest.Create(url)
          request.Method = "GET"
          Try
              Dim response As WebResponse = request.GetResponse()
              Dim dataStream As Stream = response.GetResponseStream()
              Dim reader As New StreamReader(dataStream)
              Dim responseFromServer As String = reader.ReadToEnd()
              reader.Close()
              dataStream.Close()
              response.Close()
              Return responseFromServer
          Catch ex As Exception
              Return "Error"
          End Try
      End Function
      

      您可以使用以下函数检查sql连接:

      Private Function IsDatabaseConnected() As Boolean
          Try
              Using sqlConn As New SqlConnection("YourConnectionString")
                      sqlConn.Open()
                      Return (sqlConn.State = ConnectionState.Open)
              End Using
          Catch e1 As SqlException
              Return False
          Catch e2 As Exception
              Return False
          End Try
      End Function
      

      【讨论】:

        【解决方案4】:

        将代码更改为

        Private Sub GetData()
            If My.Computer.Network.IsAvailable AndAlso g_bNetworkAlive
                ' code to get the data from table
        
            End If
        End Sub
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-01-18
          • 2011-03-23
          • 1970-01-01
          • 2011-09-07
          • 1970-01-01
          相关资源
          最近更新 更多