方案:我有一个带有“删除” ASP.NET Core控制器操作的Web服务。该实现包括两个步骤:第一步便宜,在此之后其他操作已经不再能看到已删除的数据,而第二步则是长时间运行的执行实际删除的操作。
可以将Task.Run
用于第二个操作而从不等待它,因此很快返回到调用方吗?我知道此任务可能会由于应用程序关闭而丢失,但是甚至允许它使用ASP.NET Core中的Task.Run
将工作卸载到后台,并且永远不要等待生成的任务吗?
我知道此任务可能会由于应用程序关闭而丢失,但是甚至允许它使用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。通过注册,仍然可以丢失任务,但是注册它们可以减少丢失任务的机会。