Learn how to a build a cloud-first strategyRegister Now

x
?
Solved

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

Posted on 2013-11-27
5
Medium Priority
?
310 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???
0
Comment
Question by:ryanmaves
  • 2
  • 2
5 Comments
 
LVL 12

Expert Comment

by:ShazbotOK
ID: 39682046
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.
0
 

Author Comment

by:ryanmaves
ID: 39682062
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).
0
 
LVL 35

Expert Comment

by:sarabande
ID: 39682899
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
0
 

Author Comment

by:ryanmaves
ID: 39682906
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.
0
 
LVL 35

Accepted Solution

by:
sarabande earned 2000 total points
ID: 39682927
...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.

it sounds as it would be ok. when dealing with a database you have three resources: the resources for the environment, for the connection and for the individual statement to execute.

the environment handles things like name of the data source, access rights, and number of open connections. the individual connection resources were needed to hold multiple and asynchronously running statements together. for example passing the select statement and getting the result set by one or multiple fetch operations are separate operations which only can be done using one connection exclusively. so your threads may share the environment but never the same connection. if using a new connection in each thread it should be sufficient. then you only have to care that the result sets returned by the database are also exclusive and would not go to shared data.

Sara
0

Featured Post

Windows Server 2016: All you need to know

Learn about Hyper-V features that increase functionality and usability of Microsoft Windows Server 2016. Also, throughout this eBook, you’ll find some basic PowerShell examples that will help you leverage the scripts in your environments!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

If you haven’t already, I encourage you to read the first article (http://www.experts-exchange.com/articles/18680/An-Introduction-to-R-Programming-and-R-Studio.html) in my series to gain a basic foundation of R and R Studio.  You will also find the …
In real business world data are crucial and sometimes data are shared among different information systems. Hence, an agreeable file transfer protocol need to be established.
This tutorial covers a step-by-step guide to install VisualVM launcher in eclipse.
The viewer will learn how to use the return statement in functions in C++. The video will also teach the user how to pass data to a function and have the function return data back for further processing.
Suggested Courses
Course of the Month21 days, 3 hours left to enroll

810 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question