vb.net - lockwindowupdate和BackgroundWorker的
问题描述:
我有一个有点问题,我使用一个BackgroundWorker做了很多处理,并将其添加项目到ListView有:vb.net - lockwindowupdate和BackgroundWorker的
AddListItem(ListView1, listItem)
这里委托代码将命令发送到ListView的线程之外:
Delegate Sub AddListItem_Delegate(ByVal [ListView] As ListView, ByVal [text] As Object)
Private Sub AddListItem(ByVal [ListView] As ListView, ByVal [text] As ListViewItem)
If [ListView].InvokeRequired Then
Dim MyDelegate As New AddListItem_Delegate(AddressOf AddListItem)
Me.Invoke(MyDelegate, New Object() {[ListView], [text]})
Else
ListView1.Items.Add([text])
End If
End Sub
的问题是,如你所想,忽隐忽现的列表视图中。任何人都可以帮我解决在后台工作中执行LockWindowUpdate(Me.Handle)命令吗?我试过创建一个新的委托,但它不工作(错误,我不明白vb.net足够)。
谢谢!
答
请务必不要频繁调用此代码,这对UI线程的健康状况非常不利。如果你每秒调用1000次以上,那么UI线程将会完全停止响应。它不会重新绘制,也不会响应鼠标点击。
如果您有大量要添加的项目,请确保先将它们存储在List(OfListViewItem)中,然后调用Invoke并将它们添加到列表视图中,并由BeginUpdate()和EndUpdate()括起来, 。 LockWindowUpdate()没有意义。
这将照顾大多数闪烁,但不会完全消除它。 ListView类支持双缓冲但默认情况下不启用。要解决这个问题,请在您的项目中添加一个新类并粘贴下面显示的代码。编译。从工具箱的顶部放下新控件,替换现有的ListView。
Public Class MyListView
Inherits ListView
Public Sub New()
Me.DoubleBuffered = True
End Sub
End Class
好极了,请试试看,谢谢! – Joe 2010-09-08 14:52:33