My code is
public static void Invoke(Action[] Actions)
{
Thread[] threadArray = new Thread[Actions.Length];
for (int i = 0; i < Actions.Length; i++)
{
threadArray[i] = new Thread(() =>
{
Actions[i].Invoke();
});
threadArray[i].Start();
}
}
public static void WaitAll()
{
}
public static void WaitAny()
{
}
I want to wait for all threads to complete, and also get notification when any thread completes,
like WaitAny, WaitAll
But waithandles can be used on threadpools only, could not find any examples for use on single thread.
My app requires a lot of threads, hundreds of them, theadpool has max thread limit, rest tasks are queued.
How do I manage that??
UPDATE: here is the code, please let me know if better code possible.
public class ParallelV2
{
static int waitcount = 0;
static WaitHandle[] waitHandles;
public static void Invoke(Action[] Actions)
{
waitcount = Actions.Length;
Thread[] threadArray = new Thread[Actions.Length];
waitHandles = new WaitHandle[Actions.Length];
for (int i = 0; i < Actions.Length; i++)
{
var count = i;
waitHandles[count] = new AutoResetEvent(false);
threadArray[count] = new Thread(() =>
{
Actions[count].Invoke();
((AutoResetEvent)waitHandles[count]).Set();
});
threadArray[count].Start();
}
}
public static void WaitAll()
{
while (waitcount > 0)
{
WaitHandle.WaitAny(waitHandles);
waitcount--;
}
}
public static void WaitAny()
{
WaitHandle.WaitAny(waitHandles);
}
}
In the example below, I had three threads that I needed to track. Each thread, when it was done would set its corresponding handle.
Declare it like this:
private WaitHandle[] waithandles; // see comment on static below
Create it like this:
waitcount = 3;
waithandles = new WaitHandle[3] { new AutoResetEvent(false), new AutoResetEvent(false), new AutoResetEvent(false) };
In the thread, when its finished,set it like this:
((AutoResetEvent)waithandles[i]).Set();
(Actually, thats over-simplified, but it will work if you make the waithandle static. What I actually did was have the thread perform a callback at the end of its life to signal the waithandle)
In the main thread, check it like this. When the waitcount reached zero, I knew all threads had completed
while (waitcount > 0)
{
WaitHandle.WaitAny(waithandles, 30000);
waitcount--;
}
You can wait for a thread myThread to complete with myThread.Join().
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With