如何在VB中传递线程中的多个参数

elc*_*ool 14 vb.net multithreading visual-studio

我想在VB 2008中将两个或更多参数传递给一个线程.

以下方法(修改)在没有参数的情况下工作正常,我的状态栏更新非常酷.但我似乎无法使用一个,两个或更多参数.

这是按下按钮时我想要发生的伪代码:

Private Sub Btn_Click() 

Dim evaluator As New Thread(AddressOf Me.testthread(goodList, 1))
evaluator.Start()

Exit Sub
Run Code Online (Sandbox Code Playgroud)

这是testthread方法:

Private Sub testthread(ByRef goodList As List(Of OneItem), ByVal coolvalue As Integer)

    StatusProgressBar.Maximum = 100000
    While (coolvalue < 100000)
        coolvalue = coolvalue + 1
        StatusProgressBar.Value = coolvalue
        lblPercent.Text = coolvalue & "%"
        Me.StatusProgressBar.Refresh()
    End While

End Sub
Run Code Online (Sandbox Code Playgroud)

Dar*_*rio 37

首先:AddressOf只是获取一个函数的委托 - 你不能指定任何其他东西(即捕获任何变量).

现在,您可以通过两种可能的方式启动一个线程.

  • Action在构造函数和Start()线程中传递一个.
  • ParameterizedThreadStart一个额外的对象参数传递给转发时指向的方法.Start(parameter)

我认为后一种选择是前通用的,前lambda时代的一种时代错误 - 最近已经用VB10结束了.

可以使用该原始方法并创建一个列表或结构,您将其作为此单个对象参数传递给线程代码,但由于我们现在有了闭包,您可以在匿名上创建线程,该线程Sub自身知道所有必需的变量(是由编译器为您执行的工作).

洙......

Dim Evaluator = New Thread(Sub() Me.TestThread(goodList, 1))
Run Code Online (Sandbox Code Playgroud)

这真的就是那个;)

  • 它给了我一个编译错误:`表达式预期.在Sub (3认同)
  • @dboarman:它是VB2010 ...... 3.5版本仅限于`Function(...)`-Lambdas但无法处理`Sub`s (2认同)

jga*_*fin 5

像这样的东西(我不是VB程序员)

Public Class MyParameters
    public Name As String
    public Number As Integer
End Class



newThread as thread = new Thread( AddressOf DoWork)
Dim parameters As New MyParameters
parameters.Name = "Arne"
newThread.Start(parameters);

public shared sub DoWork(byval data as object)
{
    dim parameters = CType(data, Parameters)

}
Run Code Online (Sandbox Code Playgroud)

  • 老兄,这甚至不是vb (4认同)

Han*_*son 0

只需创建一个具有两个成员(一个List(Of OneItem)和另一个)的类或结构Integer,然后发送该类的一个实例。

编辑:抱歉,错过了您也遇到了一个参数的问题。只需查看线程构造函数 (ParameterizedThreadStart),该页面就包含一个简单的示例。