If you can use .NET 4.0 then Sacha Barber has written a series of articles about the Task Parallel Library. Here is the first one:
Task Parallel Library: 1 of n[
^]
As for the optimal number of threads, I don't remember if mr. Barber convers that, but in most cases it would be best to let the ThreadPool handle that. ThreadPool is covered in mr. Barber's articles.