1

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

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

我的目标是:如果有人点击按钮,blnRequestStop 设置为 True。在那个 for...next 循环中,就在“next”之前,它检查 blnRequestStop。如果为真,那么它将退出“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
4

2 回答 2

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
于 2013-10-17T18:17:02.203 回答
-1

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

这不是一个很长的操作,您需要在循环期间更新 UI 控件,然后您可以Application.DoEvents在循环内部使用,以便在循环工作时能够在应用程序中正常使用其他控件FOR,但我建议您这样做对 UI 性能有负面影响,但如果它不是一个持续时间较长的循环,那么您可能会考虑使用DoEvents而不是引入multi-threading它只是一种替代方案,不推荐,但您可以使用它。

PS:原谅我的英语

于 2013-10-17T18:13:43.700 回答