Your best bet would be to use the Task Parallel Library (TPL). The TPL will automatically scale to include all cores on the machine in which it runs. So you could do something like this
void q1()
{ }
void q2()
{ }
void q3()
{}
void Run()
{
Action[] actions = new Action[] { q1, q2, q3 };
Parallel.Invoke(actions);
}
If you need to do things like cancel the threads, run certain actions sequentially or return values from the function then you can use the Task Class Like this
Task.Factory.StartNew(q1).ContinueWith(t => q2()).ContinueWith(t => q3());
Here is a good set of Articles from Sacha Barber on the TPL
Task Parallel Library: 1 of n[
^]
Hope this helps