You cannot use a blocking call in a UI event handler (or any other code on the UI thread) without "freezing" the user interface: if the UI thread is busy waiting for your Receive call to return, then it can't update the display in any way.
And having a "no exit" loop in any UI event handler is going to mess things up properly!
Move all your code - loop included - into a different thread, and free up the UI thread to do what it is intended for : updating the display and interacting with the user!
That has its own complications, because you cannot access in any way any UI controls except from the UI thread - so I'd suggest using the
BackgroundWorker Class (System.ComponentModel) | Microsoft Docs[
^] which allows progress reporting back to the UI thread - and pass your Textbox data back via the UserState property of the event arguments parameter.