Как передать несколько параметров в потоке в 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