How to wait for multiple STA threads to finish?
-
I create multiple STA threads and start them. Once I have started all the threads in my main thread I need to wait till all of them are done. To wait I tried WaitHandle.WaitAll() ----- returns exception Tried waitEvent.waitOne() and thread.Join() In above case some times my main thread slips through Join\waitOne(). (i.e. main thread does not wait till all other threads are done) Please advice how to implement this? My sample code is as below Main() { ... ... ArrayList myThreadClass = new ArrayList(3); ArrayList threads = new ArrayList(3); for(int i = 0 ; i< 3;i++) { ThreadClass thClass = new ThreadClass(); myThreadClass.Add(thClass); Thread myThread = new Thread( new ThreadStart(thClass.threadMethod)); myThread.ApartmentState = ApartmentState.STA; threads.Add(myThread); ((Thread)threads[i]).Start(); } for(int k = 0;k<3;k++) { ((Thread)threads[k]).Join(); } ..... ..... } //Main Ends Some more info In my thread method I do some COM calls and make some callls Writeline to StreamWriter
Sandeep Naik
-
I create multiple STA threads and start them. Once I have started all the threads in my main thread I need to wait till all of them are done. To wait I tried WaitHandle.WaitAll() ----- returns exception Tried waitEvent.waitOne() and thread.Join() In above case some times my main thread slips through Join\waitOne(). (i.e. main thread does not wait till all other threads are done) Please advice how to implement this? My sample code is as below Main() { ... ... ArrayList myThreadClass = new ArrayList(3); ArrayList threads = new ArrayList(3); for(int i = 0 ; i< 3;i++) { ThreadClass thClass = new ThreadClass(); myThreadClass.Add(thClass); Thread myThread = new Thread( new ThreadStart(thClass.threadMethod)); myThread.ApartmentState = ApartmentState.STA; threads.Add(myThread); ((Thread)threads[i]).Start(); } for(int k = 0;k<3;k++) { ((Thread)threads[k]).Join(); } ..... ..... } //Main Ends Some more info In my thread method I do some COM calls and make some callls Writeline to StreamWriter
Sandeep Naik
Hello You can go through your threads using a loop and check the
IsAlive
property of eachbool Finished = false;
while(!Finished)
{
Finished = true;
foreach(Thread T in Threads)
{
if(T.IsAlive)
Finished = false;
}
Thread.Sleep(100)
}Otherwise you can check the
ThreadState
propertyRegards:rose:
-
Hello You can go through your threads using a loop and check the
IsAlive
property of eachbool Finished = false;
while(!Finished)
{
Finished = true;
foreach(Thread T in Threads)
{
if(T.IsAlive)
Finished = false;
}
Thread.Sleep(100)
}Otherwise you can check the
ThreadState
propertyRegards:rose:
-
I tried something like this and it works with some of my testing .. Do you think if this correct ? or will there be any issues with this for(int temp = 0; temp Sandeep Naik
Hello Your code segments are inconsistent and somehow don't add up!! For example what is GRDumpThread?? Anyway, if you want to use WaitHandle class, you should register your threads in ther ThreadPool queue. Take a look at this example taken from MSDN:
using System;
using System.Threading;public sealed class App
{
// Define an array with two AutoResetEvent WaitHandles.
static WaitHandle[] waitHandles = new WaitHandle[]
{
new AutoResetEvent(false),
new AutoResetEvent(false)
};// Define a random number generator for testing. static Random r = new Random(); static void Main() { // Queue up two tasks on two different threads; // wait until all tasks are completed. DateTime dt = DateTime.Now; Console.WriteLine("Main thread is waiting for BOTH tasks to complete."); ThreadPool.QueueUserWorkItem(new WaitCallback(DoTask), waitHandles\[0\]); ThreadPool.QueueUserWorkItem(new WaitCallback(DoTask), waitHandles\[1\]); WaitHandle.WaitAll(waitHandles); // The time shown below should match the longest task. Console.WriteLine("Both tasks are completed (time waited={0})", (DateTime.Now - dt).TotalMilliseconds); // Queue up two tasks on two different threads; // wait until any tasks are completed. dt = DateTime.Now; Console.WriteLine(); Console.WriteLine("The main thread is waiting for either task to complete."); ThreadPool.QueueUserWorkItem(new WaitCallback(DoTask), waitHandles\[0\]); ThreadPool.QueueUserWorkItem(new WaitCallback(DoTask), waitHandles\[1\]); int index = WaitHandle.WaitAny(waitHandles); // The time shown below should match the shortest task. Console.WriteLine("Task {0} finished first (time waited={1}).", index + 1, (DateTime.Now - dt).TotalMilliseconds); } static void DoTask(Object state) { AutoResetEvent are = (AutoResetEvent) state; int time = 1000 \* r.Next(2, 10); Console.WriteLine("Performing a task for {0} milliseconds.", time); Thread.Sleep(time); are.Set(); }
}
// This code produces output similar to the following:
//
// Main thread is waiting for BOTH tasks to complete.
// Performing a task for 7000 milliseconds.
// Performing a task for 4000 milliseconds.
// Both tasks are completed (time waited=7064.8052)
//
// The main thread is waiting for either ta -
Hello You can go through your threads using a loop and check the
IsAlive
property of eachbool Finished = false;
while(!Finished)
{
Finished = true;
foreach(Thread T in Threads)
{
if(T.IsAlive)
Finished = false;
}
Thread.Sleep(100)
}Otherwise you can check the
ThreadState
propertyRegards:rose: