WinForm 使用BackgroundWorker及Timer实现登录动画

主要思路是用户身份验证和数据拉取放在 BackgroundWorker 的 DoWork 事件里 (也可以自己手动创建一个线程,但需要多写一些代码),在 RunWorkerCompleted 事件里启动 Timer ,然后将显示主界面代码放在 Timer 的 Tick 事件里.

这样可以解决调试过程中出现异常时无法定位到异常代码处的问题

WinForm 使用BackgroundWorker及Timer实现登录动画_第1张图片

使用 Invoke 替代 Timer 的 Tick 事件,异常时会跳转到 Invoke 语句,而不会跳转到异常代码处

使用 Timer 后

WinForm 使用BackgroundWorker及Timer实现登录动画_第2张图片

动画效果

WinForm 使用BackgroundWorker及Timer实现登录动画_第3张图片

参考代码

#Region "登录状态更新"
    Private Delegate Sub UpdataInfoCallback(Msg As String)
    ''' 
    ''' 登录状态更新
    ''' 
    Private Sub UpdataInfo(Msg As String)
        If Me.InvokeRequired Then
            Me.Invoke(New UpdataInfoCallback(AddressOf UpdataInfo), New Object() {Msg})
            Exit Sub
        End If

        Label1.Text = Msg
    End Sub
#End Region

#Region "点击登录按钮"
    Private Sub Button1_ClickAsync(sender As Object, e As EventArgs) Handles Button1.Click
        '登录
        ChangeControlVisible(False)

        With LoginBW
            .RunWorkerAsync(New LoginInfo With {
                            .LoginName = RSAEncrypt(TextBox1.Text, "公钥"),
                            .Pwd = RSAEncrypt(TextBox2.Text, "公钥")
                            })
        End With
    End Sub

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        Button1_ClickAsync(Nothing, Nothing)
    End Sub
#End Region

#Region "获取用户数据"
    Private Sub LoginBW_DoWork(sender As Object, e As DoWorkEventArgs) Handles LoginBW.DoWork
#Region "获取用户信息"
        UpdataInfo("验证账号密码")
        Dim getResult As ResultMsg = GetUserInfo(CType(e.Argument, LoginInfo))
        UpdataInfo("获取用户信息")

        Select Case getResult.Code
            Case HttpStatusCode.OK
                '获取用户信息
                sysinfo.UserLoginInfo =
                    JsonConvert.DeserializeObject(Of UserInfo)(getResult.Data.ToString)

            Case Else
                e.Result = getResult
                Exit Sub
        End Select
#End Region

#Region "获取模块权限列表"
        UpdataInfo("获取模块权限列表")
        ...
#End Region

        '获取信息完毕
        e.Result = New ResultMsg With {.Code = HttpStatusCode.OK}
    End Sub
#End Region

#Region "处理返回结果"
    Private Sub LoginBW_RunWorkerCompleted(sender As Object, e As RunWorkerCompletedEventArgs) Handles LoginBW.RunWorkerCompleted
        getResult = CType(e.Result, ResultMsg)
        LoginT.Start()
    End Sub

    Dim getResult As ResultMsg
    Private Sub LoginT_Tick(sender As Object, e As EventArgs) Handles LoginT.Tick
        LoginT.Stop()

        Select Case getResult.Code
            Case HttpStatusCode.OK
                '登录成功

            Case Else
                '登录失败
                ...
                Exit Sub

        End Select

        '登录成功
        Me.Visible = False

        Using tmpDialog As New MainForm
            tmpDialog.ShowDialog()
        End Using
    End Sub
#End Region

 

你可能感兴趣的:(.NET)