We help IT Professionals succeed at work.

Creating multithreads against the same class and joining them together after. vb.net

328 Views
Last Modified: 2013-12-01
I have searched as long as my eyes can take it and can't find quite the solution I need.  I'm creating an application that will run multiple SQL queries against a data set and rather than wait for each to finish in turn, I would like to kick off 2 at a time (using different threads for each).  The following code seems to work to create one additional thread that works, but anything beyond that seems to get destroyed (or doesn't work).

'First I create a data reader that determines how many total SQL queries need to be run
'I then loop through them...and I'm TRYING (failing) to run 2 concurrently...then waiting
'for them to finish...then moving on to the next 2

'Inside the RUNSQL class, I'm just running a simple statement and getting one value back...

'What is really strange is that if I run this in debug mode and step through it, it works...so
'the code must be stepping on itself in "real time"

'In the real code I'm trying to run 5 threads, but I've cut it back for brevity sake

If oRST.HasRows Then
            Dim intCounter As Integer = 0
            Dim oThread(1) As System.Threading.Thread
            Dim oRunSQL As New RunSQL
            Do While 1 = 1
                oRST.Read()
                intFTPKey = oRST.Item("ftp_key")
                If Err.Number <> 0 Then Exit Do
                strSQL = oRST.Item("ifs_sql").ToString
                oThread(intCounter) = New Thread(AddressOf oRunSQL.Runner)
                oRunSQL.vSQL = strSQL 'This is where I pass the unique SQL statement to the new thread
                oThread(intCounter).IsBackground = True
                oThread(intCounter).Start()
                intCounter = intCounter + 1
                If intCounter = 1 Then
                    intCounter = 0
                    oThread(0).Join()
                    oThread(1).Join()
 
                End If
            Loop
            oThread(0).Join()
            oThread(1).Join()
        End If

Anyone know what the heck I'm missing here???
Comment
Watch Question

Your setting your int counter to 1 right away before you evaluate if the counter equals 1... therefore it will allways enter the if statement on the 1st pass.

move your incrementer to after your (if) statement so it increments 1 after the fact.

Author

Commented:
You're right...but that won't solve the real issue.  I modified the code down to 2 threads...the original was checking to see if intCounter was equal to 5....(I just slimmed it down after being too tired).

When testing, I tested against a possible two threads but used code that I hoped would handle 5....so there were only two passes through the code (neither of which would have triggered the IF intCounter = 5).
CERTIFIED EXPERT
Top Expert 2016

Commented:
Dim oThread(1) As System.Threading.Thread

Open in new window

how can you use two threads with that?

you also may post the thread code. if two threads are dealing with the same database, you should have a separate connection for each (1 environment) or the threads would mix-up their statements and results.

Sara

Author

Commented:
I can post the thread code, but in short...the code is in a class and within the worker sub the connection is declared, started, and closed.  I thought that doing so would essentially create a new connection for each thread.  If that's wrong, then I suppose I can't use it.
CERTIFIED EXPERT
Top Expert 2016
Commented:
This one is on us!
(Get your first solution completely free - no credit card required)
UNLOCK SOLUTION
Unlock the solution to this question.
Join our community and discover your potential

Experts Exchange is the only place where you can interact directly with leading experts in the technology field. Become a member today and access the collective knowledge of thousands of technology experts.

*This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

OR

Please enter a first name

Please enter a last name

8+ characters (letters, numbers, and a symbol)

By clicking, you agree to the Terms of Use and Privacy Policy.