Multi threaded application to send large no of emails
Instead of rolling your own version of a parallel for each loop, you should use Parallel.ForEach(). It will make your code simpler, avoid the possibility of bugs in your Run() method and you will still be able to configure the number of threads used (through ParallelOptions).




  I start up five threads, but it will add up five more before the first five complete.


If I understand your code correctly, the only way this could happen is if you called Run() for a second time. If that's the case, it might make sense to use the producer-consumer pattern using BlockingCollection&lt;T&gt; and GetConsumingEnumerable() (or GetConsumingPartitioner() if you decide to switch to Parallel.ForEach()).


  How many threads can my server handle?


There is no way for us to answer that. You will have to perform your own measurements.


  I have database update inside the process. Is that good idea?


I don't see why would that cause any significant issues.


  Is there a chance that some threads will never finish?


There is no way for us to know that without seeing the code you didn't show.