I have the following scenario:
My application must import several sets of data from another application, and time is critical.
Because of that, it spawns one thread for each import.
So, say I have imports 1 througth 10, where imports 4 and 5 can run only after import 1, 6 and 7 after import 2 and 8, 9 and 10 after import 3
- Import 1
- Import 4
- Import 5
- Import 2
- Import 6
- Import 7
- Import 3
- Import 8
- Import 9
- Import 10
Searching around stackoverflow i found a few answers about waithandles but I'm not sure to control multiple waithandles.
I thougth about creating a list of import/handles and checking on them on a loop but i don't know how to fire the .set() from there.
Or creating a thread for each father import and instantiate the handle inside it, and that father thread fires a thread for each child import, but handling threads of a thread is something i'm not sure is correct.
Any ideias on how can i solve this ?
UPDATE:
After Brian Gideon's answer heres what i came up with:
dateSince = Convert.ToDateTime(txtBoxDateSince.Text);
dateTo = Convert.ToDateTime(txtBoxDateTo.Text);
//Loop all the days on the time interval while (DateTime.Compare(dateSince, dateTo) <= 0) {
foreach (ListItem father in checkBoxListFather.Items)
{
if (father.Selected == true)
{
processClass process = new processClass();
// This WaitHandle will be used to get the child tasks going.
var wh = new ManualResetEvent(false);
//Method to Import, wraped in a delegate
WaitCallback fatherMethod = new WaitCallback(process.importProcess);
//and its parameters
processClass.importParameters param = new processClass.importParameters(wh, father.Value, null, dateSince);
// Queue the parent task.
ThreadPool.QueueUserWorkItem(fundMethod, param);
// Register the child tasks.
foreach (ListItem child in checkBoxListChild.Items)
{
if (child.Selected == true)
{
processClass.importParameters parameters = new processClass.importParameters(null, child.Value, null, dateSince);
// Registers a callback for the child task that will execute once the
// parent task is complete.
WaitOrTimerCallback childMethod = new WaitOrTimerCallback(process.anotherImportProcess);
RegisteredWaitHandle rwh = ThreadPool.RegisterWaitForSingleObject(wh, childMethod, parameters, Timeout.Infinite, true);
}//End if (child.Selected == true)
}//End foreach (ListItem fund in checkBoxListChild.Items)
}//End if (father.Selected == true)
}//End foreach (ListItem fundProcess in checkBoxListFather.Items)
dateSince = dtSince.AddDays(1);
}//End while (DateTime.Compare(since,to) < 0)
Pretty much the same answer, just used the methods without lambda expressions and used parameters on them.
I still didn't stress test it, but it's working pretty good.
Thanks Brian.