I don't see anythign wrong with what you have (maybe if you share some of the code in myFunction, we could get a better picture).
I would recommend that you either use the ThreadPool, or that you use the Task Parallel library instead of manually creating your own thread.
Here are a few techniques:
System.Threading.Tasks.Parallel.For(0, 20, myFunction); // myFunction should accept an int, and return void)
If the signature of myFunction is different, you could use a lambda to "translate" -- be aware that you are calling a function that calls a function here:
Parallel.For(0, 20, i => myFunction()); //(I could pass any param to my function in this example)
Here's a a threadpool way
System.Threading.Threadpool.QueueUserWorkItem(myFunction) // myFunction needs to accept an object
// here's how to queue it to the threadpool with any signature
ThreadPool.QueueUserWorkItem(s => myFunction());
Another poster already mentioned using Tasks to do it. If what you are doing is pretty simple, I would just use the Parallel.For.