我不是VB编码器,但我正在修改一个小的VB.net实用程序项目,它允许你在一个表单中设置一些参数并点击“go” - 然后这会做很多可以运行的逻辑几分钟。
这一切都发生在阻止表单的go-button-handler中。我想知道,在vb.net中是否容易使所有这些逻辑发生在一个单独的线程中,它仍然可以更新表单,即更新标签以显示正在处理哪个文件?如果它很复杂,那就不值得在我的用例中使用了!
是否可以将我的事件代码复制粘贴到thread.Run或类似的东西中,甚至可以围绕我的代码动态创建一个线程类?
答案 0 :(得分:0)
我已经多次使用BackgroundWorker类(System.ComponentModel.BackgroundWorker)来做这样的事情。它使用起来非常简单(与.NET中提供的其他多线程技术相比)。例如,只需将其从工具箱拖到表单上即可。如果将其“WorkerReportsProgress”和“WorkerSupportsCancellation”属性设置为“True”,您甚至可以以进度条的形式在UI中提供反馈,并为用户提供单击取消按钮的功能。 / p>
无论如何,关于它的信息比我在这里合理包含的信息要多得多,所以我首先看看这个页面:
http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx
答案 1 :(得分: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