C# 在MVC/WebApi应用程序中混合使用异步和手动启动任务是否合适?
我正在构建一个将托管在Azure网站上的C# 在MVC/WebApi应用程序中混合使用异步和手动启动任务是否合适?,c#,azure,asp.net-web-api,task-parallel-library,async-await,C#,Azure,Asp.net Web Api,Task Parallel Library,Async Await,我正在构建一个将托管在Azure网站上的WebApi应用程序,并在适当的地方使用async调用。然而,权力机构希望我在调用方法的单独线程中进行日志记录,以便在某些“工作任务”处理日志记录时继续处理实际业务逻辑 示例场景如下所示: 请求进入asyncaction->callswait businessComponent.ProcessAsync(args)->调用synchronized\u logger.Log(message,args)->创建新任务(()=>formattandwrite(m
WebApi
应用程序,并在适当的地方使用async
调用。然而,权力机构希望我在调用方法的单独线程中进行日志记录,以便在某些“工作任务”处理日志记录时继续处理实际业务逻辑
示例场景如下所示:
请求进入async
action->callswait businessComponent.ProcessAsync(args)
->调用synchronized\u logger.Log(message,args)
->创建新任务(()=>formattandwrite(message,args)
,设置Task.configurewait(false)
,调用Task.Start()
因此,我希望有人在
async/await
和ASP.NET
处理async/await
方面更有经验,告诉我他们是否发现上述解决方案存在重大问题?这是否可能在处理实际业务逻辑请求时节省时间?是的。它可以缩短特定的需求est通过使用多个线程来处理它(假设您的业务逻辑至少有一些CPU限制的工作要做)
但是,通过对每个请求使用多个线程,您可以在相同数量的可用线程的情况下并发处理更少的请求。因此,这是一种折衷
如果目标是将该工作卸载到
线程池
中,请使用任务。显式运行
而不是新任务(…).Start
并确保在离开async
处理请求之前等待它。ASP.Net中的后台任务可以在您不知道的情况下停止。请注意,我已经尝试对此进行了一些研究,并且遇到了许多文章,其中陈述了3个问题,这导致我提出了我的问题:1.仅使用Wait If有一个明显的优势,因为等待在引擎盖下是昂贵的(这对于我们的日志记录来说太多了)2.不要将await/async与Task混合使用。在ASP.NET中运行是因为3.Task。Run显然会向线程池请求一个新线程,但它并不希望创建,因为它不是新请求。因此我不确定什么是正确的…@IWriteApps 1.我怀疑await
比这个阻止IO操作更昂贵。3.ThreadPool
通常不创建线程。它是一个已经创建的线程池。只有当线程用完时,它才会创建新线程。@我写应用程序真正的问题是我对Task的理解。Run
正如Stephen Cleary提到的,如果你的应用程序当前没有处理请求,它可以被回收。通过等待等待Ta返回的任务sk.Run您正在使该请求保持活动状态。您也可以等待它,但意识到您可能会丢失日志。只有偶尔丢失日志是可以接受的,这才是一种可接受的方法。这是因为FormatAndWrite的执行可能不会在传入请求完成并返回之前执行?间接地说,是的。ASP.NET偶尔会回收您的日志应用程序,但如果有正在处理的请求,它将不会回收。