Creating asynchronous shells for lengthy tasks is pointless in the context of ASP.NET and does nothing but degrade performance in several ways.
Executing synchronous methods asynchronously in a thread pool thread makes sense when offloading a GUI thread or other special thread. In this case, the method should be called asynchronously by the caller in this special thread, depending on how the caller is suitable (using, for example Task.Run, which, as a rule, should not be used when implementing the async method). However, in ASP.NET there are only threads thread threads, and no one needs (and really should not) unload them this way for several reasons.
( concurrency #) Task.Run : .
ASP.NET ( , ASP.NET, ). , , ASP.NET Task.Run.
[...]
, , , - .
ASP.NET.
: