在 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/await
和 ASP.NET
处理 async/await
的方式更有经验,如果他们发现上述解决方案存在重大问题,请告诉我?这是否可以在处理实际业务逻辑请求时节省时间?
是的。它可以通过使用多个线程来处理它来缩短该特定请求(假设您的业务逻辑至少有一些 CPU 绑定工作要做)。
但是,通过为每个请求使用多个线程,您可以使用相同数量的可用线程同时处理更少的请求。所以这是一个权衡。
如果目标是将该工作卸载到 ThreadPool
,请明确使用 Task.Run
而不是 new Task(...).Start
,并确保在离开 [=14] 之前 await
它=] 处理请求。 ASP.Net 中的后台任务可以在您不知情的情况下停止。
我正在构建一个将托管在 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/await
和 ASP.NET
处理 async/await
的方式更有经验,如果他们发现上述解决方案存在重大问题,请告诉我?这是否可以在处理实际业务逻辑请求时节省时间?
是的。它可以通过使用多个线程来处理它来缩短该特定请求(假设您的业务逻辑至少有一些 CPU 绑定工作要做)。
但是,通过为每个请求使用多个线程,您可以使用相同数量的可用线程同时处理更少的请求。所以这是一个权衡。
如果目标是将该工作卸载到 ThreadPool
,请明确使用 Task.Run
而不是 new Task(...).Start
,并确保在离开 [=14] 之前 await
它=] 处理请求。 ASP.Net 中的后台任务可以在您不知情的情况下停止。