Any time you have a while(true)
style loop, regardless of language or platform, there is a risk of pegging a single core at 100% or near 100% if you don't build the loop contents correctly. In this case, I suspect you have a dual core machine, such that one core is working as fast as it can. This results in the 50% number from your question. Additionally, I suspect that the blocking function in your loop does not work as you expect, and so there's is nothing in your code that will ever give the cpu a break.
You could mitigate the issue by placing a Thread.Sleep() call into the loop, but as you likely know, this could have an unwanted side effect on your socket service such that it's not actually listening for connections all the time.