我有一个接收参数的方法,我想在调用click方法时异步调用。
Private Sub audioBox(ByVal message As String)
cls_utilidades.Audio_Box(" String ")
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)_
Handles Button1.Click
'call the method
End Sub
答案 0 :(得分:2)
使用TPL(任务并行库,.NET 4.0 +)至少有两种方法:
Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) _
Handles Button1.Click
System.Threading.Tasks.Task.Factory.StartNew(AddressOf audioBox, "message")
'or
System.Threading.Tasks.Task.Factory.StartNew(Sub() audioBox("message"))
End Sub
这可能会比看起来更复杂,因为您还应该处理异常,取消等,与任何多线程方法相同。
如果您愿意,请查看TPL,良好的框架 - 在那里学习很多。
答案 1 :(得分:1)
有很多方法可以做到这一点。您可以使用BackgroundWorker
,启动普通Thread
,使用ThreadPool
等。以下是使用线程池的示例。
您必须重写您的方法以匹配WaitCallback
签名(采用普通Object
):
'be sure to add
Imports System.Threading.ThreadPool
'...
'need an object type to pass
Private Class AudioBoxArgs
Public Message As String
End Class
Private Sub audioBox(ByVal state As Object)
cls_utilidades.Audio_Box(DirectCast(state, AudioBoxArgs).Message)
End Sub
然后在你的点击处理程序中:
Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) _
Handles Button1.Click
Dim someMessage As New AudioBoxArgs()
someMessage.Message = "someMessage"
QueueUserWorkItem(AddressOf audioBox, someMessage)
End Sub
与所有异步代码一样,您应该确保cls_utilidades.Audio_Box()
是从单独的线程调用的安全方法。如果您还不熟悉线程安全性,那么您必须开始学习。