Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在MVC/WebApi应用程序中混合使用异步和手动启动任务是否合适?_C#_Azure_Asp.net Web Api_Task Parallel Library_Async Await - Fatal编程技术网

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

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

我正在构建一个将托管在Azure网站上的
WebApi
应用程序,并在适当的地方使用
async
调用。然而,权力机构希望我在调用方法的单独线程中进行日志记录,以便在某些“工作任务”处理日志记录时继续处理实际业务逻辑

示例场景如下所示:

请求进入
async
action->calls
wait 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偶尔会回收您的日志应用程序,但如果有正在处理的请求,它将不会回收。