vb.net - lockwindowupdate和backgroundworker

时间:2010-09-08 11:03:09

标签: vb.net

我遇到了一些问题,我正在使用后台工作人员进行大量处理,并将项目添加到列表视图中:

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)。

谢谢!

1 个答案:

答案 0 :(得分:0)

请确保不要过于频繁地调用此代码,这对UI线程的运行状况非常不利。如果你每秒调用它超过1000次,那么UI线程将完全停止响应。它不会再重绘,也不会响应鼠标点击。

如果要添加大量项目,请确保首先将它们存储在List(Of ListViewItem)中,然后调用Invoke()并将它们添加到列表视图中,由BeginUpdate()和EndUpdate()括起来。 LockWindowUpdate()没有意义。

这将照顾大多数闪烁,但不会完全消除它。 ListView类支持双缓冲,但默认情况下不启用。要解决此问题,请在项目中添加一个新类并粘贴下面显示的代码。编译。从工具箱顶部删除新控件,替换现有的ListView。

Public Class MyListView
    Inherits ListView

    Public Sub New()
        Me.DoubleBuffered = True
    End Sub
End Class