我编写了一个服务器程序,可以同时在线程中完成很多工作。
在这些线程中,我必须使用状态信息更新ListView,但由于它现在正在使用invoke,因此线程等待UI完成更新ListView。
有关如何将状态发送到ListView并在ListView完成更新时继续线程的任何好建议?
这是我的代码......
Public Delegate Sub InfoDelegate(status As String)
Public Sub Info(status As String)
If Me.InvokeRequired Then
Dim d As New InfoDelegate(AddressOf Info)
Me.Invoke(d, status)
Else
Dim item As New ListViewItem With {
.Text = status}
With lv
.BeginUpdate()
.Items.Insert(0, item)
If .Items.Count > 500 Then
For i As Integer = Me.lv.Items.Count - 1 To 500 Step -1
Me.lv.Items.RemoveAt(i)
Next
End If
.EndUpdate()
End With
End If
End Sub
答案 0 :(得分:2)
您可以调用Control.BeginInvoke()
以异步方式调用该方法。但是,调用之后需要进行EndInvoke()
调用,否则会导致内存和/或线程泄漏。
在.NET Framework 4.0及更高版本中,您可以利用lambda expressions将IAsyncResult
调用返回的BeginInvoke
传递给lambda表达式本身。因此,您可以在没有阻塞的情况下调用EndInvoke
,因为在调用它时,异步操作已经完成。
以下是一个例子:
Dim iar As IAsyncResult = _
Me.BeginInvoke(Sub()
Info("Status here") 'Calling your Info() method.
Me.EndInvoke(iar)
End Sub)