过早取消While循环

时间:2009-08-17 08:22:57

标签: vb.net loops while-loop

我正在使用一个While循环,它根据用户输入的值循环一定数量的循环(1-576)。用户单击“开始”按钮激活它,但我希望能够使用“Escape”键取消它。

然而,当循环进行时,我无法让程序识别任何按键。

Private Sub OnGlobalKeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles kh.KeyDown

        lblInput.Text = String.Format("'{0}' Code:{1}", e.KeyCode, CInt(e.KeyCode).ToString())


        If e.KeyCode = CType(27, Keys) Then
                    count = 0
                    loops = 0
        End If
    End Sub

My Loop

Private Sub RUNLOOP()
            While loops >= 1
                  ' my code that runs in the loop
                  loop = loop - 1
            End While
End Sub

当循环运行时,我的按键不会注册,否则它们会正常注册。

4 个答案:

答案 0 :(得分:5)

您是否考虑过使用BackgroundWorker在后台线程making sure your GUI keeps responsive中执行while循环代码(=调整/重绘表单并让用户“达到”您实现取消的方式在循环中不需要Application.DoEvents来“伪造”这种行为吗?

如果您已经在.NET Framework 4.0上,则可以尝试使用parallel programming而不是BackgroundWorker

答案 1 :(得分:2)

这有两种方法。您可以为循环使用单独的线程,也可以使用Application.DoEvents()。线程方法通常会给你最好的结果。

螺纹:

您只需调用StopLoop()告诉循环停止运行。你不想设置loop = 0,因为那时你必须使用Interlocked类来确保在线程之间正确设置循环。

Private Sub RunLoop()
  Dim loop As Action = AddressOf InternalRunLoop
  loop.BeginInvoke(null, null)
End Sub

Private bStopLoop As Boolean

Private Sub InternalRunLoop()
  While loops >= 1 And Not bStopLoop
    ' my code that runs in the loop
    loop = loop - 1
  End While
End Sub

Private Sub StopLoop()
  bStopLoop = True
End Sub

的DoEvents:

调用Application.DoEvents()将导致窗口线程上的所有挂起事件被处理。如果循环的每次迭代都需要一些时间,那么应用程序仍会对用户显示为无响应,这就是首选线程方法的原因。

Private SubRunLoop()
  While loops >= 1 And Not bStopLoop
    ' my code that runs in the loop
    loop = loop - 1
    Application.DoEvents()
  End While
End Sub

答案 2 :(得分:-1)

在循环中放置以下代码:

Application.DoEvents()

答案 3 :(得分:-3)

While counter <= 10
         ' skip remaining code in loop only if counter = 7
         If counter = 7 Then
            Exit While
         End If

         counter += 1
      End While