Visual Basic .NET:如何使用参数从方法创建任务

时间:2016-06-22 09:33:57

标签: vb.net async-await

我有一个带参数的子方法:

Public Sub mysub(ByVal x As Object)
    [...]
End Sub

要将其作为一个线程启动,我只需:

Dim x1 as String = "hello"
mythread = New Thread(AddressOf mysub)
mythread.Start(x1)

我会在mysub函数中转换async。在线教程(例如this one)仅适用于没有参数的方法。

我尝试过:

Dim mytask As Task
Dim x1 as String = "hello"
mytask = New Task(Me.mysub, x1)
mytast.Start()

但是我收到了错误:

  

错误BC30455未为'Public Sub'的参数'x'指定参数   mysub(x As Object)'

1 个答案:

答案 0 :(得分:3)

使用子 method 将导致代码继续在并行(主代码和子代码)中运行。请注意,这可能会导致竞争条件(see here),并且您也无法“完全”利用async / await方便的编程。这与您在开始时建议的多线程应用程序完全相同。

在VB中,您需要创建一个lambda自定义子来调用您的代码,然后您可以传递任何参数:

    Dim t As Task
    t = New Task(Sub() mysub(param))

    Public Sub mysub(ByVal param As ParamObject)
        [...]
    End Sub

但是,为了完整答案,我们还考虑另外使用 function 。所有函数都返回一些信息,并使用await关键字强制代码执行暂停,直到结果准备好。

在VB中,您需要定义一个包含返回类型的lambda自定义函数。然后你可以调用你的函数,包括任何需要的参数。

    Dim t As Task(Of RetObject)
    t = Task.Run(Function() As RetObject
                     Return myfunction(param)
                 End Function)
    Return Await t

    Public Function myfunction(ByVal param As ParamObject) As RetObject
        [...]
    End Function

您在这里做的是同步代码的async包装函数。出于多种原因(see here)不鼓励这样做。始终建议从头开始编写代码,从地下室采取async-await行为。