我如何调用在visual basic中接收参数的异步方法

时间:2014-01-17 16:44:49

标签: vb.net visual-studio-2008 asynchronous

我有一个接收参数的方法,我想在调用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

2 个答案:

答案 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()是从单独的线程调用的安全方法。如果您还不熟悉线程安全性,那么您必须开始学习。