none
关于VB中多线程运行较长时间后,性能下降的问题 RRS feed

  • 问题

  • 最近,在写一个程序,功能是实时监听本地的UDP 514端口,获取syslog数据报,并将数据报写入文件。

    一开始用阻塞模式,程序执行一会儿后,大约能获取20多个数据报,就进入假死状态;

    后采用了多线程,程序不会假死,但发现如果运行较长时间后,每秒钟获取的数据报数量,与程序刚开始执行时获取的数据报数量有很大差别,程序刚开始执行时,大约每秒能获得10几个数据报,到后来,每秒只有2到3个数据报了。

    想请教一下,这个是什么原因,该如何改进,谢谢!

    代码如下

     Private Sub Getsyslog()                   '获取514端口上的syslog数据报
            Dim SyslogBytes As [Byte]() = SyslogServer.Receive(SyslogIpEndPoint)
            Dim SyslogData As String = Encoding.ASCII.GetString(SyslogBytes)
            SyslogMessage = SyslogData + vbCrLf
        End Sub
    
        Private Sub Runsyslog()
            Try
                While (Counter <= 200)
                    Getsyslog()
                    
                    TextBox1.Text = TextBox1.Text + SyslogMessage + vbCrLf
    
                    Counter = Counter + 1
                End While
                
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
        End Sub
    
        Private Sub btngetsyslog_Click(sender As Object, e As EventArgs) Handles btngetsyslog.Click
            SyslogThread = New Thread(AddressOf Runsyslog)
            MessageBox.Show("当前连接IP及端口:" + SyslogIpEndPoint.ToString())
            delay(1)
            If (SyslogServer.Available > 0) Then
                MessageBox.Show("连接成功" + SyslogServer.Available.ToString())
            End If
    
            SyslogThread.Start()
    
        End Sub

    2014年5月22日 8:28

答案

  • 的确如此,我在while循环内,取消了textbox1的赋值过程,线程快了很多,但中间仍有数据包丢失的现象。我用wireshark(基于winpcap)抓包分析,每秒大约有200个左右的数据报,但通过“udpclient.receive方法”和“多线程”每秒获取的数据报不等,多的有100多个,少的10几个。是否需要使用winpcap等程序来协助访问网络底层,直接获取数据包?

    谢谢你的帮助!

    2014年5月23日 7:32

全部回复

  • Getsyslog()
    TextBox1.Text = TextBox1.Text + SyslogMessage + vbCrLf

    我的看法是 我们可以先缩小范围, 确定是Getsyslog这个方法里获取的效率变慢了  还是下一行显示结果效率降低。

    remember make the reply as answer and vote the reply as helpful if it helps.

    2014年5月23日 5:47
  • 的确如此,我在while循环内,取消了textbox1的赋值过程,线程快了很多,但中间仍有数据包丢失的现象。我用wireshark(基于winpcap)抓包分析,每秒大约有200个左右的数据报,但通过“udpclient.receive方法”和“多线程”每秒获取的数据报不等,多的有100多个,少的10几个。是否需要使用winpcap等程序来协助访问网络底层,直接获取数据包?

    谢谢你的帮助!

    2014年5月23日 7:32
  • 的确如此,我在while循环内,取消了textbox1的赋值过程,线程快了很多,但中间仍有数据包丢失的现象。我用wireshark(基于winpcap)抓包分析,每秒大约有200个左右的数据报,但通过“udpclient.receive方法”和“多线程”每秒获取的数据报不等,多的有100多个,少的10几个。是否需要使用winpcap等程序来协助访问网络底层,直接获取数据包?

    谢谢你的帮助!

    嗯  我赞同你的看法! 最好还是借助winpcap程序来协助访问网络底层来解决丢包和效率问题。


    remember make the reply as answer and vote the reply as helpful if it helps.

    2014年5月26日 2:04
  • 感谢你的帮助!谢谢!
    2014年5月26日 2:24