如果我不等待它,是不是保证从 Mvc.Controller 操作方法调用的异步方法完成? [复制]
Posted
技术标签:
【中文标题】如果我不等待它,是不是保证从 Mvc.Controller 操作方法调用的异步方法完成? [复制]【英文标题】:Is an async method called from a Mvc.Controller action method guaranteed to finish if I don't await it? [duplicate]如果我不等待它,是否保证从 Mvc.Controller 操作方法调用的异步方法完成? [复制] 【发布时间】:2016-05-30 06:33:29 【问题描述】:如果我有一个长时间运行的async
方法,我在我的Mvc.Controller
操作方法中调用它而不等待它,它是否保证即使在我从操作方法返回后它也会完成?
例子:
[HttpPost]
public ActionResult DoLongRunningTask()
//not awaited async method
LongRunningTask();
return new HttpStatusCodeResult(HttpStatusCode.OK);
public async Task LongRunningTask()
await Task.Delay(5000);
编辑:
我在谷歌搜索时确实找到了How to safely call an async method in C# without await,但我想知道是否有人可以专门澄清 ASP.NET MVC。当仔细查看问题中的所有答案时,此答案/链接中有一些信息:https://***.com/a/15523793/585968,正如@MickyD 所指出的那样。
除非有人有一些更具体的关于 ASP.NET MVC 的具体信息,否则我会接受以重复的形式结束这个问题。
【问题讨论】:
在这种情况下您应该返回状态 Accepted 而不是 OK。接受意味着您已经开始但尚未完成,并且该处理可能未完成。 OK表示你已经处理成功了。 您的实际问题是否更接近How to run Background tasks in ASP.Net? @GregBeech 公平点,但这只是示例代码。 @Damien_The_Unbeliever 不是真的,因为我想知道 ASP.NET 如何专门处理这种情况。 不过,您应该能够推断从那篇博文中得到答案。当它讨论 QueueBackgroundWorkItem 时:“ASP.NET 运行时将尝试延迟 AppDomain 关闭,直到这些工作项完成执行。......它可以尝试将 AppDomain 延迟长达 90 秒,以便让您的任务完成。如果你不能在 90 秒内完成,那么你将需要一种不同的(并且更强大,意思是,脱离过程的)技术。” 【参考方案1】:编辑:不,不能保证(但几乎)
简短回答:是的
长答案:是的,但并非总是如此。
如果异步方法花费的时间超过您的默认超时时间,它将被取消。但是,如果您已经发送了 REST 请求(或任何远程命中并运行 API),则无关紧要。
我解决此问题的方法是使用带有队列的 Azure Web 作业。所以我的主应用程序只是向“so something”发送请求,Azure 只是等待每个完成,然后再启动另一个。而我的WEB服务器已经在前进了。
编辑:回答问题。
【讨论】:
回答 “是,但并非总是” 对 “是否有保证” 的问题毫无意义。无论如何,不确定您是否正确:"ASP.NET was not designed for this, and there's no guarantee that your code will run after the response is returned. ASP.NET will do its best to let it run, but it can't guarantee it." 实际上并非如此。在大多数情况下,新任务/线程将竞争。 “切断”有一个超时时间(仍在试图找到配置它的位置)。默认情况下似乎约为 5 秒。对于大多数任务来说,5 秒绰绰有余。这就是为什么我回答“是的,但并非总是如此”。我正在使用未等待的任务来跟踪具有大量访问者的网站/应用程序上的一些分析,并且迄今为止从未遇到过问题 Good 'ol "在我的机器上工作" 嘿?以上是关于如果我不等待它,是不是保证从 Mvc.Controller 操作方法调用的异步方法完成? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
如果我不使用 MFC,是不是需要 afxres.h?如何从 .RC 脚本中删除它?
我不确定我的 iOS 应用程序图标的 dpi 大小是不是合适