【问题标题】:Visual Basic .NET: how to create a task from a method with parametersVisual Basic .NET:如何从带参数的方法创建任务
【发布时间】:2017-02-15 17:44:22
【问题描述】:

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

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 作为对象)'

【问题讨论】:

  • 如果您使用 .NET 4.0 或更高版本,您可以使用 lambda:New Task(Sub() Me.mysub(x1))
  • 就是这样!非常感谢。

标签: vb.net async-await


【解决方案1】:

使用子 method 将导致代码继续并行运行,包括主代码和子代码。请注意,这可能会导致竞争条件 (see here),而且您将无法“完全”利用 async / await 方便的编程。这和你一开始建议的多线程应用场景完全一样。

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

    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 行为。

【讨论】:

    猜你喜欢
    • 2015-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多