线程。按钮如何点击中断/影响程序流程

时间:2013-10-17 17:38:58

标签: vb.net multithreading winforms

我的项目是vb.net 2010 windows桌面。 到目前为止,单线程(默认)。

如果SUBroutine在其中有一个for ... next循环正在运行,那么如果触发了buttonclick事件并且在该事件中变量被更改,会发生什么?比如:程序执行是否会离开正在运行的循环?或者,当buttonclick事件改变了该变量时,它是否继续运行?

我的目标是: 如果有人单击该按钮,则blnRequestStop设置为True。 在...下一个循环中,就在“下一个”之前,它检查blnRequestStop。如果为true,则它将退出“for”循环。

我猜我需要使用线程?有人能给我一个简单的例子吗?

编辑: 下面的代码似乎正常工作。但也许你们都看到了问题?

If (btnProcess.Text = "Done!") Then
    End
ElseIf (btnProcess.Text = "IMPORT") Then
    bRequestStop = False
    t1 = New Thread(AddressOf ProcessDo)
    t1.Start()
Else
    t2 = New Thread(AddressOf MyInterrupt)
    t2.Start()
End If

以下是ProcessDo和MyInterrupt的简短版本:

Private Sub ProcessDo()
    For each X in blahblah
        'do stuff (yes, includes interface)
        if (blnInterrupt) then exit For
    Next X
    End
End Sub

Private Sub MyInterrupt()
    blnInterrupt=true
End Sub

2 个答案:

答案 0 :(得分:2)

是的,您可能希望在后台线程上执行长时间运行的任务。这是一个代码示例,包括在完成后如何将结果返回到UI线程(否则您将收到有关Cross-thread operation not valid的错误。)

ThreadPool是在后台线程上做一些工作的好方法。您可以在停止按钮的按钮单击事件中设置stopIt = True

ThreadPool.QueueUserWorkItem(
  Sub()
    For Each thing In things
      If stopIt Then Exit Sub
      'Do the stuff!
    Next

    'We're done, update UI
    Me.UpdateUI("All done!")
  End Sub)

要安全地更新UI,您需要确保返回UI线程。

Public Sub UpdateUI(result As String)
  If Me.InvokeRequired() Then 
    'If we aren't on the UI thread, invoke this function on the UI thread
    Me.BeginInvoke(Sub() UpdateUI(result))
    Exit Sub
  End If

  'Update UI here
  lblResult.Text = result
End Sub

答案 1 :(得分:-1)

执行是' 停止 '(在某种程度上),直到循环完成他的工作,所以是的,你需要多线程。

这不是一个非常长的操作,您需要在循环期间更新UI控件,然后您可以在循环内使用Application.DoEvents,以便能够在{{1}时在应用程序中正常使用其他控件循环正在工作,但我告诉你这会对UI性能产生负面影响,但如果它不是一个持续时间很长的循环,那么你可能会考虑使用FOR而不是引入DoEvents它只是另一种选择,不推荐,但你可以使用它。

PS:原谅我的英文