GUI 冻结,尽管程序继续在后台运行

问题描述 投票:0回答:1

背景: 我有一个 Windows 窗体应用程序(在 VB.Net 中),可以控制和监视机械臂的运动。我在运行时有几个线程(大约 5-7 个)来执行此操作。我使用同步锁在线程之间同步共享变量。我还有 2 个 TCPIP 连接。不幸的是我无法提供任何代码。 GUI 有一些标签,我经常用计时器和几个按钮来更新它们,例如显示运行时写入的 txt 文件或切换布尔变量的状态。

问题: 该应用程序在开始时可以平稳运行一段时间,我猜大约 1 到 3 小时。之后,GUI 冻结,但程序仍然在后台正确运行。我知道,因为机器人仍然在移动,并且创建的日志文件提供了正确的信息。

谨慎的直觉:每当在表单上按下按钮时,UI 都会比不按下按钮时冻结得更快。

如有任何建议,我将不胜感激。

vb.net
1个回答
0
投票

通常,当 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

如果没有您提供更多信息,这一切都只是猜测。

© www.soinside.com 2019 - 2024. All rights reserved.