VB.Net暂停并继续下一步操作
我有下面的代码(VB.Net),它正是我想要的(即在代码的特定间隔/位置暂停,并在单击Messagebox按钮时恢复)。。。。。。。 唯一的问题是我使用了一个messagebox;有没有办法用按钮来代替做同样的工作;没有计时器,没有消息框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
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首次引入的,因此这将是您可以使用的最旧版本;我尝试了几天来做这个更新;我会解决的。。。非常感谢您的评论和回答;我以前向其他成员使用过您的答案,它们非常有用。。。我认识你。。。干杯