VB.NET学习笔记:再谈委托——同步、异步、Lambda 表达式和内置委托

本文探讨了VB.NET中如何利用委托防止窗体假死,通过同步委托、异步委托(如Delegate.Invoke、Delegate.BeginInvoke与Control.Invoke、Control.BeginInvoke)以及Lambda表达式的应用,详细解释了各种调用方式的原理和差异,并介绍了.NET Framework内置的委托类型。通过实例代码展示了如何有效避免线程间操作异常,提高用户体验。
摘要由CSDN通过智能技术生成

由于近期在研究防止窗体假死该如何给长时间运行的方法加一个等待的画面,需要用到异步委托和Lambda 表达式,所以紧急饿补了相关内容,现把学习感受记录备查。
相关博文:《异步委托实现等待窗体(loading界面),执行任务超时可以取消操作
本文主要是简化《程序长时间执行任务时窗体会失去响应造成假死避免重复点击按钮的解决思路》一文代码,更突出问题。

一、窗体假死

新建一个windows窗体应用程序,在窗体里拉入一个按钮Button和一个Label控件,为按钮单击事件添加如下代码:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        '暂时移除Button1按钮点击事件
        RemoveHandler Button1.Click, AddressOf Button1_Click

        '******************************************
        '模拟长时间工作代码
        For i As Integer = 0 To 100
            '模拟长时间工作
            Threading.Thread.Sleep(100)

            '显示工作进度
            Me.Label1.Text = i.ToString & "%"
        Next
        '******************************************

        '工作结束后记得恢复Button1按钮点击事件
        AddHandler Button1.Click, AddressOf Button1_Click
    End Sub

执行循环时窗体不能拖动,点击按钮无反应,Label也不能实时显示工作进度,直到循环结束直接显示100%,窗体处于假死状态。

二、同步委托

为了便于理解,我把长时间运行的代码封装到一个方法里,然后在按钮单击事件里调用该方法。

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        '暂时移除Button1按钮点击事件
        RemoveHandler Button1.Click, AddressOf Button1_Click

        '******************************************
        '调用长时间工作代码
        Call aa()
        '******************************************

        '工作结束后记得恢复Button1按钮点击事件
        AddHandler Button1.Click, AddressOf Button1_Click
    End Sub

    Private Sub aa()
        For i As Integer = 0 To 100
            '模拟长时间工作
            Threading.Thread.Sleep(100)

            '显示工作进度
            Me.Label1.Text = i.ToString & "%"
        Next
    End Sub

改用同步委托(Delegate.Invoke)调用方法:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        '暂时移除Button1按钮点击事件
        RemoveHandler Button1.Click, AddressOf Button1_Click

        '******************************************
        '调用长时间工作代码
        'Call aa()

        '改用委托调用方法
        Dim method As Meth
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值