VB.NET学习笔记:程序长时间执行任务时窗体会失去响应造成假死避免重复点击按钮的解决思路

本文探讨了VB.NET中遇到的窗体假死问题及其解决方案,包括使用`Application.DoEvents()`、事件处理和异步调用委托。通过实例展示了如何避免在程序长时间运行时窗体失去响应,同时防止用户重复点击按钮导致多次执行事件代码。最后,作者提出了对实现后台等待窗口展示进度的思考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、暴露问题——窗体假死

新建一个Windown窗体应用程序,在窗体代码里写入如下代码:

Public Class MainForm
    Dim intTime As Integer = 0

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click, Button2.Click
        '运行计时器
        intTime = 0
        Me.Timer1.Enabled = True

        '******************************
        '模拟长时间工作代码
        Me.Label1.Text = "开始工作!"
        For i As Integer = 0 To 100
            '模拟长时间工作
            Threading.Thread.Sleep(100)
            '显示工作进度
            Me.Label1.Text = i.ToString & "%"
        Next
        '******************************

        '关闭计时器
        Me.Timer1.Enabled = False
    End Sub

    Private Sub MainForm_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Me.Timer1.Interval = 1000 '设置引发Timer1.Tick事件的时间间隔
    End Sub

    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
        intTime += Me.Timer1.Interval
        '实时显示运行时间
        Me.Label2.Text = String.Format("{0}秒", intTime / 1000)
    End Sub
End Class

因为需长时间运行代码,所以想整个显示工作进度的界面,2种实现方式:百分比方式适用于循环等知道总工作量的代码、计时显示适用于无法事先计算总工作量的代码,可是测试时却发现事与愿为,代码并没有依我们所想象的那样在窗体界面实时显示工作进度或工作时间,而且窗体失去响应,无法拖动,点击按钮也没有反应,甚至计时器压根就没有启动计时工作。因为不知道是否成功运行了按钮事件代码,所以忍不住的多次重复点击按钮,又发现程序会重复运行按钮事件代码,即使将按钮的Enalbe 属性设置为 false还是会触发点击事件,这可不是我想的结果。
于是从网上搜索得知

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值