背景: 我有一个 Windows 窗体应用程序(在 VB.Net 中),可以控制和监视机械臂的运动。我在运行时有几个线程(大约 5-7 个)来执行此操作。我使用同步锁在线程之间同步共享变量。我还有 2 个 TCPIP 连接。不幸的是我无法提供任何代码。 GUI 有一些标签,我经常用计时器和几个按钮来更新它们,例如显示运行时写入的 txt 文件或切换布尔变量的状态。
问题: 该应用程序在开始时可以平稳运行一段时间,我猜大约 1 到 3 小时。之后,GUI 冻结,但程序仍然在后台正确运行。我知道,因为机器人仍然在移动,并且创建的日志文件提供了正确的信息。
谨慎的直觉:每当在表单上按下按钮时,UI 都会比不按下按钮时冻结得更快。
如有任何建议,我将不胜感激。
通常,当 UI 上运行的某些内容正在等待 UI 上发生其他事情时,UI 会被冻结。这将冻结 UI。
Public Class Form1
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim tsk As Task
tsk = Task.Run(Sub()
Me.Invoke(Sub()
Label1.Text = DateTime.Now.ToString
End Sub)
End Sub)
tsk.Wait()
End Sub
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
Button1.PerformClick()
End Sub
End Class
这是一个修复方法,
Public Class Form1
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim tsk As Task
tsk = Task.Run(Sub()
'use BeginInvoke instead
Me.BeginInvoke(Sub()
Label1.Text = DateTime.Now.ToString
End Sub)
End Sub)
tsk.Wait()
End Sub
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
Button1.PerformClick()
End Sub
End Class
使用 Async / Await 的另一个修复
Public Class Form1
Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim tsk As Task
tsk = Task.Run(Sub()
Me.Invoke(Sub()
Label1.Text = DateTime.Now.ToString
End Sub)
End Sub)
Await tsk
End Sub
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
Button1.PerformClick()
End Sub
End Class
如果没有您提供更多信息,这一切都只是猜测。