线程:更新UI而不阻塞线程?

时间:2016-12-17 08:58:37

标签: vb.net multithreading

我编写了一个服务器程序,可以同时在线程中完成很多工作。

在这些线程中,我必须使用状态信息更新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

1 个答案:

答案 0 :(得分:2)

您可以调用Control.BeginInvoke()以异步方式调用该方法。但是,调用之后需要进行EndInvoke()调用,否则会导致内存和/或线程泄漏。

在.NET Framework 4.0及更高版本中,您可以利用lambda expressionsIAsyncResult调用返回的BeginInvoke传递给lambda表达式本身。因此,您可以在没有阻塞的情况下调用EndInvoke,因为在调用它时,异步操作已经完成。

以下是一个例子:

Dim iar As IAsyncResult = _
    Me.BeginInvoke(Sub()
                                   Info("Status here") 'Calling your Info() method.
                                   Me.EndInvoke(iar)
                               End Sub)