VB 2008で2つ以上のパラメーターをスレッドに渡すことを探しています。
次のメソッド(変更済み)はパラメーターなしで正常に機能し、ステータスバーは非常にクールに更新されます。しかし、1つ、2つ、またはそれ以上のパラメーターで動作させることはできません。
これは、ボタンが押されたときに起こるはずのことの擬似コードです:
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
まず/:AddressOf
は関数へのデリゲートを取得するだけです。他のものは指定できません(つまり、変数をキャプチャします)。
これで、2つの可能な方法でスレッドを起動できます。
Action
を渡し、スレッドにStart()
だけを渡します。ParameterizedThreadStart
を渡して転送one.Start(parameter)
を呼び出すときにポイントされるメソッドに追加のオブジェクト引数後者のオプションは、ジェネリック前、ラムダ前の時代からの時代錯誤であると考えています。これは遅くともVB10で終了しています。
couldその粗雑なメソッドを使用して、このようにスレッドコードに渡すリストまたは構造を作成します単一オブジェクトパラメータですが、 nowクロージャーを使用すると、必要な変数自体をすべて知っている匿名のSub
にスレッドを作成できます(これはコンパイラーによって実行されます)。
スー...
Dim Evaluator = New Thread(Sub() Me.TestThread(goodList, 1))
本当にそれだけです;)
このようなもの(私は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)
}
Dim evaluator As New Thread(Sub() Me.testthread(goodList, 1))
With evaluator
.IsBackground = True ' not necessary...
.Start()
End With
Darioがデリゲートについて述べたことに加えて、いくつかのパラメーターを使用してデリゲートを実行できます。
デリゲートを事前定義します。
Private Delegate Sub TestThreadDelegate(ByRef goodList As List(Of String), ByVal coolvalue As Integer)
デリゲートのハンドルを取得し、配列にパラメーターを作成し、Delegateに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)
さて、簡単な方法は、すべてのパラメーター値を保持する適切なクラス/構造を作成し、それをスレッドに渡すことです。
VB10の別の解決策は、ラムダがclosureを作成するという事実を使用することです。これは基本的に、コンパイラーが自動的に上記を自動的に行うことを意味します。
Dim evaluator As New Thread(Sub()
testthread(goodList, 1)
End Sub)
私はこれがあなたを助けると思う...開始時にスレッドを作成し、データを渡す!
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.
List(Of OneItem)
とInteger
の2つのメンバーを持つクラスまたは構造を作成し、そのクラスのインスタンスを送信します。
編集:申し訳ありませんが、1つのパラメーターにも問題があることをお見逃しました。 Thread Constructor(ParameterizedThreadStart) を見ると、そのページに簡単なサンプルが含まれています。
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