是否允许在ASP.NET Core控制器中使用Task.Run?

问题描述 投票:0回答:1

方案:我有一个带有“删除” ASP.NET Core控制器操作的Web服务。该实现包括两个步骤:第一步便宜,在此之后其他操作已经不再能看到已删除的数据,而第二步则是长时间运行的执行实际删除的操作。

可以将Task.Run用于第二个操作而从不等待它,因此很快返回到调用方吗?我知道此任务可能会由于应用程序关闭而丢失,但是甚至允许它使用ASP.NET Core中的Task.Run将工作卸载到后台,并且永远不要等待生成的任务吗?

asp.net-core asp.net-core-2.1
1个回答
0
投票

我知道此任务可能会由于应用程序关闭而丢失,但是甚至允许它使用ASP.NET Core中的Task.Run将工作卸载到后台,并且永远不会等待生成的任务吗?

哦,当然,没有什么可以阻止这种情况。 .NET和ASP.NET允许您使用Task.Run,并且响应将立即返回给用户(假设您忽略了从Task.Run返回的任务)。

可以使用Task.Run进行第二次操作而从不等待它,因此很快会返回到调用方吗?

您说您知道该任务可能会在应用程序关闭时丢失。没错;因此完全有可能第二次删除永远不会发生,并且不会有错误或日志消息通知您该事实。此外,由于忽略了该任务,因此如果该任务失败将不会有任何通知,因此,如果删除代码有问题,则没有日志或任何内容会通知您常规失败。如果您对此表示满意,则可以使用即弃即用功能。

在ASP.NET Core上,您甚至不需要Task.Run;您可以只调用执行第二次删除操作的(异步)方法,然后忽略该任务,而不是await执行该任务。

只需忽略任务就可以工作(带有或不带有Task.Run),但这确实具有负面影响,即ASP.NET不知道卸载的工作全部。因此,我建议registering the task and having something delay the app shutdown until the tasks have a chance to complete。通过注册,仍然可以丢失任务,但是注册它们可以减少丢失任务的机会。

© www.soinside.com 2019 - 2024. All rights reserved.