VB.Net暂停并继续下一步操作

VB.Net暂停并继续下一步操作,vb.net,visual-studio-2010,Vb.net,Visual Studio 2010,我有下面的代码(VB.Net),它正是我想要的(即在代码的特定间隔/位置暂停,并在单击Messagebox按钮时恢复)。。。。。。。 唯一的问题是我使用了一个messagebox;有没有办法用按钮来代替做同样的工作;没有计时器,没有消息框 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Dim Index As Integer For KKK = 1 To 50

我有下面的代码(VB.Net),它正是我想要的(即在代码的特定间隔/位置暂停,并在单击Messagebox按钮时恢复)。。。。。。。 唯一的问题是我使用了一个messagebox;有没有办法用按钮来代替做同样的工作;没有计时器,没有消息框

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim Index As Integer
    For KKK = 1 To 50
        Index = KKK / 5
        If Index = KKK / 5 Then
            MessageBox.Show("Paused at: " & KKK & " : Click OK to Resume")
        End If
    Next
End Sub

提前感谢您的评论和帮助。

您可以通过将循环放入一个单独的线程中,休眠暂停,然后单击按钮来中断。在本例中,button1启动循环,button2在
thread.sleep
处中断循环

Dim newThread As New Thread(AddressOf loopSub)
Delegate Sub textAddCallback(ByVal s As string)

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
newThread.Start()
End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
newThread.Interrupt()
End Sub

Sub loopSub()
  Dim Index As Integer
  Dim textDelegate As New textAddCallback(AddressOf textAdd)

  Try
      For KKK As Integer = 1 To 50
          Index = KKK / 5
          If Index = KKK / 5 Then
              Thread.Sleep(36000) ' sleep the max amount of milliseconds
          End If
      Next
  Catch ex As ThreadInterruptedException
      Me.Invoke(textDelegate, "string to add")
  End Try

End Sub

Sub textAdd(ByVal s As String)
rtext1.text &= s
End Sub

需要2个按钮和一个标签。试试这个:

Dim Pause As Boolean    

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button2.Click
    Dim Index As Integer
    Pause = False
    Button2.Text = "Ok"
    Button2.Enabled = False
    For KKK = 1 To 50
        System.Threading.Thread.Sleep(250) 'Just for testing purposes, do not use this instruction.
        Index = KKK / 5
        If Index = KKK / 5 Then
            Label1.Text = "Paused at: " & KKK & " : Click OK to Resume"
            Pause = True
            Button2.Enabled = True
            Button2.Focus()
            While Pause
                Application.DoEvents()
            End While
            Label1.Text = ""
            Button2.Enabled = False
        End If
    Next
End Sub

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    Pause = False
End Sub

如果升级到VS2013社区(这是免费的),则可以使用异步/等待组合,如下所示:

Public Class Form1

    Private MRE As New Threading.ManualResetEvent(False)

    Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Button1.Enabled = False
        Button2.Enabled = False

        For KKK = 1 To 50
            If KKK Mod 5 = 0 Then
                Label1.Text = KKK
                MRE.Reset()
                Button2.Enabled = True
                Await WaitForButton()
            End If
        Next

        Button1.Enabled = True
    End Sub

    Private Function WaitForButton() As Task
        Return Task.Run(Sub()
                            MRE.WaitOne()
                        End Sub)
    End Function

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        Button2.Enabled = False
        MRE.Set()
    End Sub

End Class

Hi-xpda;谢谢。。。我试图测试您的代码,但它不允许我在Sub loopSub()内的RichTextBox中追加文本,因为它位于单独的线程中。。。我最初是在下一个循环中使用RichTextBox。。。有没有办法做到这一点?是的,这有点混乱,但您可以使用调用委托。我会在答案中加上这个(未经测试,但你会明白的);我想知道messagebox是如何完成这项工作的?这应该可以,但我认为CPU负载可能会在While循环中激增;我正在尝试代码,但它似乎不起作用?我仍在努力使它工作,但我得到了你的想法;在CPU问题上,我同意你的观点;您知道Messagebox如何在不影响CPU的情况下完成这项工作吗?CPU的问题很小。DoEvents()方法处理消息队列中的所有消息。@Abbas1999修复了代码。但是,这比messagebox要好,messagebox是一个模式窗口,在按ok之前不允许执行任何操作。在第一代Corei3上测试,CPU消耗并不关键。一个是单核系统,而While循环将其限制在100%。在双核系统上,这将是50%。您拥有的核心越多,其影响似乎就越小。如果这是一个问题,只需在循环中调用Sleep()。睡眠(10)足以显著减少使用量。我必须承认你的解决方案非常有效。在Visual Studio 2012中测试Ultimate.Async/Await是VS2012首次引入的,因此这将是您可以使用的最旧版本;我尝试了几天来做这个更新;我会解决的。。。非常感谢您的评论和回答;我以前向其他成员使用过您的答案,它们非常有用。。。我认识你。。。干杯