当前位置 : 主页 > 编程语言 > c语言 >

vb.net – DoEvents是否仅影响当前线程?

来源:互联网 收集:自由互联 发布时间:2021-06-24
我有一个简单的“工作”表单,它在自己的线程上运行,以通知用户应用程序在长时间运行期间没有死亡.为了使工作表单更新,我必须插入一个DoEvents()调用. 我很好奇,这只会为我当前的线
我有一个简单的“工作”表单,它在自己的线程上运行,以通知用户应用程序在长时间运行期间没有死亡.为了使工作表单更新,我必须插入一个DoEvents()调用.

我很好奇,这只会为我当前的线程输入消息,还是会为整个应用程序执行此操作?我希望主窗口保持无响应直到操作完成,所以我很好奇这个行为.以下是工作表单的代码.

为了清楚起见,我对我的代码很好,但我想知道DoEvents()如何与线程一起运行.

Public Class frmWorking

    ''' <summary>
    ''' Creates and starts a new thread to handle the Working Dialog
    ''' </summary>
    ''' <returns>The thread of the Working dialog.</returns>
    ''' <remarks></remarks>
    Public Shared Function StartWait() As WorkingFromToken
        Dim th As New Threading.Thread(AddressOf ShowWait)
        Dim token As New WorkingFromToken
        th.Start(token)
        Return token
    End Function

    Private Shared Sub ShowWait(token As WorkingFromToken)
        Dim frm As New frmWorking
        Try
            frm.Show()
            Do
                If frm.txtWait.Text.Length > 45 Then
                    frm.txtWait.Text = "Working"
                Else
                    frm.txtWait.Text &= "."
                End If
                Windows.Forms.Application.DoEvents()
                Threading.Thread.Sleep(250)
            Loop While token.Running
            frm.Hide()

        Catch ex As Threading.ThreadAbortException
            Threading.Thread.ResetAbort()
            frm.Hide()
            Return
        End Try

    End Sub

End Class
DoEvents只会抽取当前的UI线程.

但是,我不推荐你的方法.

相反,您应该在后台线程上完成工作,并在UI线程上显示模式进度表单并使用BeginInvoke或BackgroundWorker更新它.

网友评论