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 
+0

好极了,请试试看,谢谢! – Joe 2010-09-08 14:52:33