在 MVC/WebApi 应用程序中将异步与手动启动任务混合使用是否合适?

Can it ever be appropriate to mix async with manually starting tasks in an MVC/WebApi application?

我正在构建一个将托管在 Azure 网站上的 WebApi 应用程序,并且我在适当的地方使用 async 调用。但是,希望我让日志记录发生在与调用方法不同的线程中,以便在一些 "worker task" 处理日志记录的同时继续处理实际的业务逻辑。

示例场景如下所示:

请求进入 async 操作 -> 调用 await businessComponent.ProcessAsync(args) -> 同步调用 _logger.Log(message, args) -> 创建 new Task(() => FormatAndWrite(message, args),设置 task.ConfigureAwait(false),调用 task.Start()

所以我希望有人对 async/awaitASP.NET 处理 async/await 的方式更有经验,如果他们发现上述解决方案存在重大问题,请告诉我?这是否可以在处理实际业务逻辑请求时节省时间?

是的。它可以通过使用多个线程来处理它来缩短该特定请求(假设您的业务逻辑至少有一些 CPU 绑定工作要做)。

但是,通过为每个请求使用多个线程,您可以使用相同数量的可用线程同时处理更少的请求。所以这是一个权衡。

如果目标是将该工作卸载到 ThreadPool,请明确使用 Task.Run 而不是 new Task(...).Start,并确保在离开 [=14] 之前 await 它=] 处理请求。 ASP.Net 中的后台任务可以在您不知情的情况下停止。