How to pass multiple parameters in thread in VB

前端 未结 8 1415
面向向阳花
面向向阳花 2020-12-30 05:31

I\'m looking to pass two or more parameters to a thread in VB 2008.

The following method (modified) works fine without parameters, and my status bar gets updated ver

相关标签:
8条回答
  • 2020-12-30 05:32

    Well, the straightforward method is to create an appropriate class/structure which holds all your parameter values and pass that to the thread.

    Another solution in VB10 is to use the fact that lambdas create a closure, which basically means the compiler doing the above automatically for you:

    Dim evaluator As New Thread(Sub()
                                    testthread(goodList, 1)
                                End Sub)
    
    0 讨论(0)
  • 2020-12-30 05:36

    In addition to what Dario stated about the Delegates you could execute a delegate with several parameters:

    Predefine your delegate:

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

    Get a handle to the delegate, create parameters in an array, DynamicInvoke on the Delegate:

    Dim tester As TestThreadDelegate = AddressOf Me.testthread
    Dim params(1) As Object
    params(0) = New List(Of String)
    params(1) = 0
    
    tester.DynamicInvoke(params)
    
    0 讨论(0)
  • 2020-12-30 05:43

    First of all: AddressOf just gets the delegate to a function - you cannot specify anything else (i.e. capture any variables).

    Now, you can start up a thread in two possible ways.

    • Pass an Action in the constructor and just Start() the thread.
    • Pass a ParameterizedThreadStart and forward one extra object argument to the method pointed to when calling .Start(parameter)

    I consider the latter option an anachronism from pre-generic, pre-lambda times - which have ended at the latest with VB10.

    You could use that crude method and create a list or structure which you pass to your threading code as this single object parameter, but since we now have closures, you can just create the thread on an anonymous Sub that knows all necessary variables by itself (which is work performed for you by the compiler).

    Soo ...

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

    It's really just that ;)

    0 讨论(0)
  • 2020-12-30 05:45

    Pass multiple parameter for 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
    
    0 讨论(0)
  • 2020-12-30 05:49

    I think this will help you... Creating Threads and Passing Data at Start Time!

    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.
    
    0 讨论(0)
  • 2020-12-30 05:51

    Just create a class or structure that has two members, one List(Of OneItem) and the other Integer and send in an instance of that class.

    Edit: Sorry, missed that you had problems with one parameter as well. Just look at Thread Constructor (ParameterizedThreadStart) and that page includes a simple sample.

    0 讨论(0)
提交回复
热议问题