积极答复者
关于VB中多线程运行较长时间后,性能下降的问题

问题
-
最近,在写一个程序,功能是实时监听本地的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
答案
全部回复
-
的确如此,我在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.