0

私は帯域幅監視システムに取り組んでいます。特定のインスタンスで送受信されるデータの量をループして表示したいのですが、処理中にシステムがフリーズするという問題があります。バックグラウンドで動作させたいだけです。私が他のことをしている間、システムで定義されているテキストボックスに結果が表示されます。関数は次のとおりです。

Private Function netSpeed() As Boolean

    Dim networkInterfaces As New System.Diagnostics.PerformanceCounterCategory("Network Interface")
    Dim nics As String() = networkInterfaces.GetInstanceNames()
    Dim bytesSent(nics.Length - 1) As System.Diagnostics.PerformanceCounter
    Dim bytesReceived(nics.Length - 1) As System.Diagnostics.PerformanceCounter

    bytesSent(9) = New System.Diagnostics.PerformanceCounter("Network Interface", "Bytes Sent/sec", nics(9), True)
    bytesReceived(9) = New System.Diagnostics.PerformanceCounter("Network Interface", "Bytes received/sec", nics(9), True)

    Dim up As Integer
    Dim down As Integer

    For k As Integer = 0 To 2
        up = bytesSent(9).NextValue
        down = bytesReceived(9).NextValue

        System.Threading.Thread.Sleep(1000)

    Next

    TextBox1.Text = up
    TextBox2.Text = down

    Return True
End Function

注意: インターフェイス 9 をテストしています。つまり、イーサネット インターフェイスです。提案に感謝します

4

1 に答える 1

0
Private Sub netSpeed()

    Dim networkInterfaces As New System.Diagnostics.PerformanceCounterCategory("Network Interface")
    Dim nics As String() = networkInterfaces.GetInstanceNames()
    Dim bytesSent(nics.Length - 1) As System.Diagnostics.PerformanceCounter
    Dim bytesReceived(nics.Length - 1) As System.Diagnostics.PerformanceCounter

    bytesSent(9) = New System.Diagnostics.PerformanceCounter("Network Interface", "Bytes Sent/sec", nics(9), True)
    bytesReceived(9) = New System.Diagnostics.PerformanceCounter("Network Interface", "Bytes received/sec", nics(9), True)

    Dim up As Integer
    Dim down As Integer

    Do
        up = bytesSent(9).NextValue
        down = bytesReceived(9).NextValue
        System.Threading.Thread.Sleep(1000)

        AddText(up)
        AddTxt(down)
    Loop

End Sub

Delegate Sub AddTextCallBack(ByVal [text] As String)

Private Sub AddText(ByVal [text] As String)
    If Me.TextBox1.InvokeRequired Then
        Dim d As New AddTextCallBack(AddressOf AddText)
        Me.Invoke(d, New Object() {[text]})
    Else
        Me.TextBox1.Text = [text]
    End If
End Sub

Private Sub AddTxt(ByVal [text] As String)
    If Me.TextBox2.InvokeRequired Then
        Dim d As New AddTextCallBack(AddressOf AddTxt)
        Me.Invoke(d, New Object() {[text]})
    Else
        Me.TextBox2.Text = [text]
    End If
End Sub

私はついにこれを手に入れました。誰かがより良い方法を持っているなら、助けてください。これは機能していますが、もっと良い方法があるかもしれません。

于 2013-04-28T19:12:59.810 に答える