0

我不是 VB 编码员,但我正在修补一个小的 VB.net 实用程序项目,它可以让您在表单中设置一些参数并点击“开始” - 然后执行很多可以运行几分钟的逻辑.

这一切都发生在阻止表单的 go-button-handler 中。我想知道,在 vb.net 中是否很容易让所有这些逻辑发生在一个单独的线程中,该线程仍然可以更新表单,即更新标签以显示正在处理的文件?如果它很复杂,那么在我的用例中就不值得这样做!

是否可以将我的事件代码复制粘贴到 thread.Run 或类似的东西中,甚至可以围绕我拥有的代码动态创建一个线程类?

4

2 回答 2

0

BackgroundWorker 是一个不错的选择。无论您使用什么请注意,如果后台线程是处理器密集型的,即长时间运行的紧密循环,性能可能会受到影响。如果你有一个多核 CPU,这可能不是很明显。

这是一个简单的 Threading.Thread 示例。

Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
    Button3.Enabled = False
    'for example pass a string and an integer to a thread as an array
    Dim params() As Object = {"one", 1} 'parameters for thread. object picked because of mixed type
    Dim t As New Threading.Thread(AddressOf someThread)
    t.IsBackground = True
    t.Start(params) 'start thread with params
End Sub

Public Sub someThread(params As Object)
    'not on the UI
    Dim theparams() As Object = DirectCast(params, Object()) 'convert object to what it really is, an array of objects
    Dim param1 As String = DirectCast(theparams(0), String)
    Dim param2 As Integer = DirectCast(theparams(1), Integer)
    Debug.WriteLine(param1)
    Debug.WriteLine(param2)

    showOnUI(param1)
End Sub

Public Sub showOnUI(s As String)
    If Me.InvokeRequired Then
        'not running on UI
        Me.Invoke(Sub() showOnUI(s)) 'run method on UI
    Else
        'running on UI
        Label1.Text = s
        Button3.Enabled = True
    End If
End Sub
于 2013-10-10T15:47:09.587 回答
0

我已经多次使用 BackgroundWorker 类 (System.ComponentModel.BackgroundWorker) 来处理这样的事情。它使用起来非常简单(与 .NET 中可用的其他多线程技术相比)。例如,只需将其从工具箱拖到您的表单上。如果您将其“WorkerReportsProgress”和“WorkerSupportsCancellation”属性设置为“True”,您甚至可以在您的UI 中以进度条的形式提供反馈,并为用户提供单击取消按钮的能力。

无论如何,关于它的信息比我可以合理地包含在这里的信息要多得多,所以我将从查看此页面开始:

http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx

于 2013-10-10T15:22:15.207 回答