我有一个带参数的子方法:
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)'
答案 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
行为。