Как передать несколько параметров в потоке в VB

Я хочу передать два или более параметров в поток в VB 2008.

Следующий метод (модифицированный) отлично работает без параметров, и моя строка состояния обновляется очень круто. Но я не могу заставить его работать с одним, двумя или более параметрами.

Это псевдо-код того, что я думаю, должен произойти при нажатии кнопки:

Private Sub Btn_Click() 

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

Exit Sub

Это метод 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

Ответ 1

Прежде всего: AddressOf просто получает делегат функции - вы не можете указать что-либо еще (т.е. захватить любые переменные).

Теперь вы можете запустить поток двумя возможными способами.

  • Передайте Action в конструкторе и просто Start() поток.
  • Передайте ParameterizedThreadStart и перенаправляйте один дополнительный аргумент объекта методу, указанному при вызове .Start(parameter)

Я рассматриваю последний вариант анахронизма из предраковых, до-лямбда-раз, которые закончились не последним с VB10.

Вы можете использовать этот грубый метод и создать список или структуру, которые вы передаете вашему потоковому коду в качестве этого единственного параметра объекта, но поскольку у нас сейчас есть закрытие, вы можете просто создать поток на анонимный Sub, который сам знает все необходимые переменные (это работа, выполненная для вас компилятором).

Су...

Dim Evaluator = New Thread(Sub() Me.TestThread(goodList, 1))

Это действительно так;)

Ответ 2

Как то так (я не программист на 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)

}

Ответ 3

Dim evaluator As New Thread(Sub() Me.testthread(goodList, 1))
With evaluator
.IsBackground = True ' not necessary...
.Start()
End With

Ответ 4

Ну, простой метод заключается в создании соответствующего класса/структуры, который содержит все ваши значения параметров и передает их в поток.

Другим решением в VB10 является использование того факта, что lambdas создает закрытие, что в основном означает, что компилятор делает это автоматически для вас:

Dim evaluator As New Thread(Sub()
                                testthread(goodList, 1)
                            End Sub)

Ответ 5

В дополнение к тому, что Дарио заявил о делегатах, вы можете выполнить делегат с несколькими параметрами:

Предопределите делегата:

Private Delegate Sub TestThreadDelegate(ByRef goodList As List(Of String), ByVal coolvalue As Integer)

Получить дескриптор делегата, создать параметры в массиве, DynamicInvoke на делетете:

Dim tester As TestThreadDelegate = AddressOf Me.testthread
Dim params(1) As Object
params(0) = New List(Of String)
params(1) = 0

tester.DynamicInvoke(params)

Ответ 6

Просто создайте класс или структуру, в которой есть два члена: один List(Of OneItem) и другой Integer и отправьте экземпляр этого класса.

Изменить: Извините, пропустили, что у вас были проблемы с одним параметром. Просто посмотрите Конструктор потоков (ParameterizedThreadStart), и эта страница содержит простой пример.

Ответ 7

Я думаю, это поможет вам... Создание потоков и передача данных во время запуска!

Imports System.Threading

' The ThreadWithState class contains the information needed for 
' a task, and the method that executes the task. 
Public Class ThreadWithState
    ' State information used in the task. 
    Private boilerplate As String 
    Private value As Integer 

    ' The constructor obtains the state information. 
    Public Sub New(text As String, number As Integer)
        boilerplate = text
        value = number
    End Sub 

    ' The thread procedure performs the task, such as formatting 
    ' and printing a document. 
    Public Sub ThreadProc()
        Console.WriteLine(boilerplate, value)
    End Sub  
End Class 

' Entry point for the example. 
' 
Public Class Example
    Public Shared Sub Main()
        ' Supply the state information required by the task. 
        Dim tws As New ThreadWithState( _
            "This report displays the number {0}.", 42)

        ' Create a thread to execute the task, and then 
        ' start the thread. 
        Dim t As New Thread(New ThreadStart(AddressOf tws.ThreadProc))
        t.Start()
        Console.WriteLine("Main thread does some work, then waits.")
        t.Join()
        Console.WriteLine( _
            "Independent task has completed main thread ends.")
    End Sub 
End Class 
' The example displays the following output: 
'       Main thread does some work, then waits. 
'       This report displays the number 42. 
'       Independent task has completed; main thread ends.

Ответ 8

Передача нескольких параметров для VB.NET 3.5

 Public Class MyWork

    Public Structure thread_Data            
        Dim TCPIPAddr As String
        Dim TCPIPPort As Integer            
    End Structure

    Dim STthread_Data As thread_Data
    STthread_Data.TCPIPAddr = "192.168.2.2"
    STthread_Data.TCPIPPort = 80  

    Dim multiThread As Thread = New Thread(AddressOf testthread)
    multiThread.SetApartmentState(ApartmentState.MTA)
    multiThread.Start(STthread_Data)     

    Private Function testthread(ByVal STthread_Data As thread_Data) 
        Dim IPaddr as string = STthread_Data.TCPIPAddr
        Dim IPport as integer = STthread_Data.TCPIPPort
        'Your work'        
    End Function

End Class