Why the app stops answeringintermediate
Blocking on async work parks a pool thread waiting for something that itself needs a pool thread — under load every thread ends up parked, and the app is neither crashed nor busy, it just stops responding.
Sync over async in a request path. It works in testing and dies under load.
AssumesBlocking the threadThread-pool starvation is unreadable without the async model. Same track, five sprints apart.
Async all the way through the request path, no blocking, no Task.Run, no async void.
Published in full, before you start — every point is one of these and there is nothing else.
Blocking on async work parks a pool thread waiting for something that itself needs a pool thread — under load every thread ends up parked, and the app is neither crashed nor busy, it just stops responding.
A proxy in front of a paid API needs a rate limit or one user can spend your whole budget, and a cancellation token so a closed browser tab stops the work.