After making a small change to an ASP.NET core application, I got the following runtime error:
System.InvalidOperationException: 'Synchronous operations are disallowed. Call ReadAsync or set AllowSynchronousIO to true instead.'
Here is the code that caused the error:
Let's explore why this happens, when it occurs, and most importantly, how to fix it properly.
Why does this exception occur?
Starting with ASP.NET Core 3.0, Microsoft made a significant architectural change: synchronous I/O operations are disabled by default on the server. This decision was made to improve application performance and prevent thread pool starvation.
In traditional synchronous I/O operations, threads are blocked while waiting for data to be read or written. In a web server handling hundreds or thousands of concurrent requests, this can quickly exhaust the thread pool, leading to:
- Poor scalability
- Increased response times
- Potential deadlocks
- Resource exhaustion
Asynchronous I/O operations release threads back to the thread pool while waiting for I/O operations to complete, allowing the server to handle more concurrent requests with fewer resources avoiding all the issues above.
Solutions: The right way vs. The quick fix
The right way to fix this is by switching to an async version of our code:
If an async alternative is not available and you really want to use synchronous operations, you can enable this globally or at the request level:
More information
Breaking changes in .NET Core 3.0 - .NET | Microsoft Learn
Configure options for the ASP.NET Core Kestrel web server | Microsoft Learn