Mar*_*lla 1 vb.net async-await
我有一个带参数的子方法:
Public Sub mysub(ByVal x As Object)
[...]
End Sub
Run Code Online (Sandbox Code Playgroud)
要将其作为线程启动,我只需执行以下操作:
Dim x1 as String = "hello"
mythread = New Thread(AddressOf mysub)
mythread.Start(x1)
Run Code Online (Sandbox Code Playgroud)
我会转换mysub一个async函数。在线教程(例如本教程)仅适用于没有参数的方法。
我尝试过:
Dim mytask As Task
Dim x1 as String = "hello"
mytask = New Task(Me.mysub, x1)
mytast.Start()
Run Code Online (Sandbox Code Playgroud)
但是我得到了错误:
错误BC30455未为“公共子mysub(x作为对象)”的参数“ x”指定参数
使用子method代码将导致代码继续在paralell中运行,包括主代码和子代码。请注意,这可能会导致竞争条件(请参阅此处),并且您将无法“完全”利用异步/等待便捷编程的优势。这与您在一开始建议的多线程应用程序完全相同。
在VB中,您需要创建一个lambda自定义子程序来调用您的代码,然后可以传递任何参数:
Dim t As Task
t = New Task(Sub() mysub(param))
Public Sub mysub(ByVal param As ParamObject)
[...]
End Sub
Run Code Online (Sandbox Code Playgroud)
但是,为使答案完整,让我们考虑另外使用a 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
Run Code Online (Sandbox Code Playgroud)
您在这里所做的是一个async用于同步代码的包装函数。不建议这样做有很多原因(请参见此处)。始终建议从头开始编写代码,以async-await从地下室获取行为。