-1

我正在使用此代码

For Each item In ListBox1.Items
        ListBox2.Items.Add(item + ":" + item)

我怎么能放慢速度,这样我的程序就不会冻结。

4

3 回答 3

1

简单的答案是使用 DoEvents() 这告诉您的 UI 线程查看是否还有其他消息需要处理,例如您的 UI 更改。警告,这将允许用户单击您的按钮,关闭您的表单等。您需要锁定一些东西,以便用户无法在运行时单击两次按钮或关闭表单。此外,我通常避免在每个循环中运行 DoEvents。这取决于您的情况以及您在循环中的内容,但每 100 个应该在您发布的示例中起作用。

Dim iLoop as int32 = 0
For Each item In ListBox1.Items
  ListBox2.Items.Add(item + ":" + item)
  iLoop += 1
  If i mod 100 = 0 then 'Only runs 1 out of 100 times
    system.windows.forms.application.doevents()
  end if
next
于 2013-10-21T14:58:09.167 回答
1

BeginUpdate()在循环之前和之后调用EndUpdate(),以便列表框只更新一次。

于 2013-10-20T23:13:45.220 回答
0
Private Delegate Sub dlgUpdateUI(ByVal text As String)
Private t As Threading.Thread = New Threading.Thread(AddressOf updateListbox)

Private Sub updateListbox()

    For Each item In ListBox1.Items

        If ListBox2.InvokeRequired Then
            Dim d As New dlgUpdateUI(AddressOf updateListbox)
            ListBox2.Invoke(d, Text)
        Else
            ListBox2.Items.Add(item & ":" & item)
        End If

    Next

t.Start()

http://msdn.microsoft.com/en-us/library/aa645740%28v=vs.71%29.aspx

http://en.wikipedia.org/wiki/Thread_%28computing%29

于 2013-10-21T05:13:50.380 回答