gpt4 book ai didi

vb.net - 线程 : Update UI without blocking the thread?

转载 作者:行者123 更新时间:2023-12-03 12:59:43 28 4
gpt4 key购买 nike

我编写了一个服务器程序,它同时在线程中执行大量工作。

在这些线程中,我必须使用状态信息更新 ListView,但由于它现在使用调用,线程等待 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

最佳答案

您可以调用 Control.BeginInvoke() 异步调用该方法。但是,该调用后需要跟一个 EndInvoke() 调用,否则您将获得内存和/或线程泄漏。

在 .NET Framework 4.0 及更高版本中,您可以使用 lambda expressions通过IAsyncResultBeginInvoke 返回调用 lambda 表达式本身。因此,您可以调用EndInvoke无需阻塞,因为在调用它时异步操作已经完成。

这是一个例子:

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

关于vb.net - 线程 : Update UI without blocking the thread?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41196961/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com