Ok, kids, let me explain how this stuff works. First of all, adding a try-catch block around ANY code would NEVER make it hang less.
Having one thread per room is shooting yourself in your foot. It would cause X = amount of loaded rooms to be added to your CPU to be cycled. It scales incredibly poorly and literary eats up system resources.
The way to go is pooling, as I did in Butterfly. It would probably be a better idea to use a timer or something like that, but the way I did it in bfly was good enough. The difference between this and the other approach is that the OS handles how many threads should be running, not the amount of rooms that is loaded. That way it is more scalable and the calls are asynchronous.
Edit:
Also, here is a way better socket which I used in bfly:
https://github.com/martinmine/Connectivity It basically talks directly to the Winsock API so you don't need all the overhead caused by the generalized socket class in .NET