Making blocking calls to ``async`` methods transforms something that was intended to be asynchronous into a synchronous block. Doing so can cause deadlocks and unexpected blocking of context threads.
The root cause of this deadlock is due to the way ``await`` handles contexts. By default, when an incomplete ``Task`` is awaited, the current “context” is captured and used to resume the method when the ``Task`` completes. This “context” is the current ``SynchronizationContext`` unless it’s null, in which case it’s the current ``TaskScheduler``. GUI and ASP.NET applications have a ``SynchronizationContext`` that permits only one chunk of code to run at a time. When the ``await`` completes, it attempts to execute the remainder of the ``async`` method within the captured context. But that context already has a thread in it, which is (synchronously) waiting for the ``async`` method to complete. They’re each waiting for the other, causing a deadlock.