如何通过单击按钮打破循环

use*_*279 4 vb.net loops click button break

我正在使用 VB.NET,我有:

  • 一个Start按钮
  • 一个Stop按钮
  • 一个While循环

Start按下按钮时,While循环开始。我想在Stop按下按钮时停止循环。

我曾尝试使用Applications.DoEvents,但当Stop按下按钮两次时循环停止。

下面是我的代码使用 Applications.DoEvents

Dim stopclick As Boolean = False

Private Sub btnPlay_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnPlay.Click
    btnForward.Enabled = False
    btnStop.Enabled = True
    While 
        ' Perform the while statements
        If stopclick = True Then
            stopclick = False
            Application.DoEvents()
            Exit While
        End If
    End While
End Sub

Private Sub btnStop_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnStop.Click
    stopClick = True
End Sub
Run Code Online (Sandbox Code Playgroud)
  1. 我用Application.DoEvents错了吗?
  2. 除此之外还有哪些选择Application.DoEvents?如何通过Stop单击按钮停止循环?

Ste*_*art 5

您需要将调用放在语句Application.DoEvents之外If,如下所示:

While True
    Application.DoEvents()
    ' Perform the while statements
    If stopclick Then
        stopclick = False
        Exit While
    End If
End While
Run Code Online (Sandbox Code Playgroud)

Stop_Click您调用 之前不会有机会被处理DoEvents,因此,按照您的方式,stopClick永远不会设置为True

然而,这里更大的问题是,调用DoEvents是非常糟糕的做法,如果您不小心,可能会导致一些非常难以修复的错误。如果在后台线程中执行循环会好得多。查看BackgroundWorker组件以获取易于实现的 WinForm 项目线程机制。您可以在表单设计器的工具箱中找到它。

以下是如何使用BackgroundWorker组件执行此操作的示例:

Dim stopclick As Boolean = False

Private Sub btnPlay_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnPlay.Click
    btnForward.Enabled = False
    btnStop.Enabled = True
    BackgroundWorker1.RunWorkerAsync()
End Sub

Private Sub btnStop_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnStop.Click
    stopClick = True
End Sub

Private Sub BackgroundWorker1_DoWork(sender As Object, e As DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    stopClick = False
    While Not stopClick
        ' Perform the while statements
    End While
End Sub

Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
    btnForward.Enabled = True
    btnStop.Enabled = False
End Sub
Run Code Online (Sandbox Code Playgroud)