我有一个简单的“工作”表单,它在自己的线程上运行,以通知用户应用程序在长时间运行期间没有死亡.为了使工作表单更新,我必须插入一个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 ClassDoEvents只会抽取当前的UI线程.
但是,我不推荐你的方法.
相反,您应该在后台线程上完成工作,并在UI线程上显示模式进度表单并使用BeginInvoke或BackgroundWorker更新它.