You're calling Read, which is a synchronous method. That means that it will block the current thread until data is read. The current thread is the UI thread so the UI freezes.
You need to do the reading on a secondary thread if you want the UI not to freeze. That means either calling Read on a secondary thread or else calling ReadAsync or BeginRead. Any of those options is going to complicate your code but such is the nature of multi-threading.
Also note that, even if you read the data on a secondary thread, you must update the UI on the UI thread only.