When modernizing legacy .NET apps, I often see this pattern:
“Let’s wrap the sync code in
Task.Run () and await it.”
-> It looks async.
-> It compiles async.
-> But it’s fake async.
What really happens:
-> Blocking I/O is moved to the ThreadPool
-> Threads are still consumed
->...