Do Not Use Task.Run for I/O Bound Work
Task.Run is for CPU-bound work. Wrapping a synchronous I/O call in Task.Run does not make it truly async — you just burn a thread pool thread while waiting. Use truly async APIs: HttpClient, EF Core async methods, Stream.ReadAsync, and so on.