none
Funktionsaufruf abbrechen RRS feed

  • Frage

  •  

    Hallo liebe Forumsbesucher,

    für euch vielleicht eine einfache Frage.

    Wie kann ich einen Funktionsaufruf abbrechen (z.B. unten angefügten), wenn er beispielsweise nach 1 Sekunde keinen Wert zurückgibt?

     

    strName = Dns.GetHostEntry(tcpInfo.RemoteEndPoint.Address).HostName.ToString()
    

    Vielen Dank.

    VG Stefan

    Donnerstag, 7. Oktober 2010 18:56

Antworten

Alle Antworten

  • Hallo Stefan,

    ich kann aus Deinem Code leider nicht viel lesen. Zunächst solltest Du die Zeile einmal catchen:

    Try
        strName = Dns.GetHostEntry(tcpInfo.RemoteEndPoint.Address).HostName.ToString()
      
        Catch ex As Exception
          MsgBox("get DNS: " & ex.Message)
        End Try
    

    Und dann die TCP oder Http Instanz mittels property .timeout auf 1000 setzen. Das führt nach Verlauf größer 1000 ms auf den Catch.

    Gruß Ellen


    Ich benutze/ I'm using VB2008 & VB2010
    Donnerstag, 7. Oktober 2010 19:39
  • Hallo Stefan

    anstelle könnte man als anderen Ansatz manchmal asynchrone Varianten wie
    Dns.BeginGetHostEntry
    http://msdn.microsoft.com/de-de/library/system.net.dns.begingethostentry.aspx

    http://msdn.microsoft.com/de-de/library/system.net.dns.endgethostentry.aspx

    nutzen (ein 'Abbruch' gibt es nicht explizit, aber 'blockiert' wenigsten nicht).
    Braucht etwas mehr an Logik,
    und man muss hier ggf gewisse Multi-Threading -Bedingungen (im Callback) beachten.
    Donnerstag, 7. Oktober 2010 19:53
  • Hallo Ellen,

      strName = Dns.GetHostEntry(tcpInfo.RemoteEndPoint.Address).HostName.ToString()
     

    Und dann die TCP oder Http Instanz mittels property .timeout auf 1000 setzen.

    welche 'TCP' oder 'Http' Instanz meinst Du hier? Stefan möchte die Methode Dns.GetHostEntry verwenden, hier gibt es keinen Timeout, den man selber festlegen könnte.


    Thorsten Dörfler
    Microsoft MVP Visual Basic
    vb-faq.de
    Donnerstag, 7. Oktober 2010 20:03
    Moderator
  • Hallo Thorsten,

    ich habe es gesehen. Die Klasse DNS gibt kein Timeout her. Das muss anders gehen. Es wäre hilfreich, wenn Stefan mehr Code zeigen würde.

    Gruß Ellen


    Ich benutze/ I'm using VB2008 & VB2010
    Donnerstag, 7. Oktober 2010 20:11
  • Hallo Ellen,

    so sieht die Klasse aus:

     

    #Region "Netzwerkverbindungen"
    ''' <summary>
    ''' In dieser Klasse werden im ListView alle TCP-Netzwerkverbindungen eingetragen.
    ''' </summary>
    Public Class AddRows
    
      ''' <summary>
      ''' Datenauflistung aller Spalten und Zeilen mit Daten vom Typ "Werte". 
      ''' </summary>
      Public Shared Property Zeile As New ObservableCollection(Of Werte)
    
      ''' <summary>
      ''' Zählt alle TCP-Verbindungen.
      ''' </summary>
      Public Shared Property i As Int32
    
      ''' <summary>
      ''' Informationen über die Netzwerkverbindungen. 
      ''' </summary>
      Public Shared Property ipGlobal As IPGlobalProperties = IPGlobalProperties.GetIPGlobalProperties()
    
      ''' <summary>
      ''' TCP-Verbindungsinformationen.
      ''' </summary>
      Public Shared Property tcpInfoList As TcpConnectionInformation() = ipGlobal.GetActiveTcpConnections()
    
      ''' <summary>
      ''' Dem ListView Zeilen hinzufügen.
      ''' </summary>
      Public Sub NewRows()
        Dim strName, strIPR, strIPL, strStatus, strNetw, strPortR, strPortL As String    ' Werte der Spalten.
        Dim tcpInfo As TcpConnectionInformation                       ' Alle aktiven TCP-Verbindungen.
    
        ' Alle TCP-Verbindungen auflisten.
        If i >= tcpInfoList.Length Then   ' Alle TCP-Verbindungen wurden abgerufen.
          NetTraffic.t.Stop()       ' Timer stoppen.
          Exit Sub            ' Methode verlassen.
        End If
    
        tcpInfo = tcpInfoList(i)      ' Alle TCP-Verbindungen nacheinander abrufen.
        i += 1               ' Potentielle nächste Verbindung.
    
        ' DNS-Name des Remote-Endpunkts, Status, Remote IP, Local IP, Netzwerk, Remote Port, Local Port.
        strName = GetName(tcpInfo.RemoteEndPoint.Address)
        strIPR = tcpInfo.RemoteEndPoint.Address.ToString
        strIPL = tcpInfo.LocalEndPoint.Address.ToString
        strStatus = tcpInfo.State.ToString
        strNetw = tcpInfo.RemoteEndPoint.AddressFamily.ToString
        strPortR = tcpInfo.RemoteEndPoint.Port.ToString
        strPortL = tcpInfo.LocalEndPoint.Port.ToString
    
        Zeile.Add(New Werte With {.Spalte1 = strName, _
                     .Spalte2 = strIPR, _
                     .Spalte3 = strIPL, _
                     .Spalte4 = strStatus, _
                     .Spalte5 = strNetw, _
                     .Spalte6 = strPortR, _
                     .Spalte7 = strPortL}) ' Zeile hinzufügen.
    
      End Sub
    
      ''' <summary>
      ''' Den DNS-Name der IP-Adresse ermitteln.
      ''' </summary>
      ''' <param name="IPAdrr">IP-Adresse.</param>
      ''' <returns>DNS-Name.</returns>
      Private Function GetName(ByVal IPAdrr As System.Net.IPAddress) As String
        ' Versuchen, den DNS-Name abzurufen.
        Try
          Return Dns.GetHostEntry(IPAdrr).HostName.ToString()
        Catch ex As Exception
          Return ""
        End Try
      End Function
    
    End Class
    
    ''' <summary>
    ''' Neuer Datentyp, der die Werte einer Zeile darstellt.
    ''' </summary>
    Public Class Werte
      Public Property Spalte1 As String
      Public Property Spalte2 As String
      Public Property Spalte3 As String
      Public Property Spalte4 As String
      Public Property Spalte5 As String
      Public Property Spalte6 As String
      Public Property Spalte7 As String
    End Class
    #End Region
    

     

    VG Stefan

    Donnerstag, 7. Oktober 2010 20:26
  • Das muss anders gehen.

    Ja, das hat Thomas in seinem Beitrag ja bereits gezeigt.


    Thorsten Dörfler
    Microsoft MVP Visual Basic
    vb-faq.de
    Donnerstag, 7. Oktober 2010 20:31
    Moderator
  • Hallo Thomas,

    da fehlt mir das Know-How, um das ad-hoc umzusetzen. Da muss ich mich erst einlesen.

    Auf jeden Fall hilfreich, Danke dafür.

    VG Stefan

    Donnerstag, 7. Oktober 2010 20:37
  • Ja, das hat Thomas in seinem Beitrag ja bereits gezeigt.


    Hallo Thorsten,

    ich habe schon vieles in .NET gelernt und vor allen eines: Es gibt immer mehrere Wege zum Ziel. Deshalb würde ich die Möglichkeit hier mit Timeout zu arbeiten adhoc nicht ausschliessen. Ich würde es sogar fordern, gerade bei Netzwerkzugriffen. Allerdings muss ich hier passen. Mir fällt im Moment keine andere Lösung ein.

    schöne Grüße Ellen

     


    Ich benutze/ I'm using VB2008 & VB2010
    Freitag, 8. Oktober 2010 07:48