The socket client was starting a thread that tight looped to remove item...

...s from a queue. Each iteration of the loop where the queue was empty (most iterations) threw an exception creating massive amounts of GC garbage. This code was also not threadsafe, so locks were added.
it would be safer to include all your MessageQueuePendingEvent Set/Reset inside "lock ( this.outboundQueue ) {", because right now it looks possible to enqueue a message, set the event, and reset the event without actually sending the message