Sorry I intended to reply to your second question but I guess I ran to work :S
As korv said... thread per players is a very poor way of handling things.
There's lots of ways you could handle your threading and I don't think anyone here can make the claim that there's one absolute best way to deal with it in every situation but here's some of my oppinions.
Use an async socket system so that you don't need to have threads blocked off for receiving from client (eliminates the need for thread per client). From there I would tell the threadpool to process the received information. This allows for packets to be processed concurrently while at the same time not needing you to hard code a specific number of threads to switch between. From there I'd most likely just create a couple server threads to run through specific functions (monster AI thread, slow updates, fast updates is my general advice but I'm sure others would disagree)
If you write a threading system and you find certain things are really not running the way you would expect them to (such as monsters slowing down/freezing while the server runs) then I'd suggest using the stopwatch class to time how long each thread loop takes to execute. It really helps you track down issues. I know I was having an issue with my monster thread once where monsters were not being removed from the active collection so as players logged in/monsters re spawned the thread was slowing down more and more till it appeared almost frozen.