【问题标题】:Is it allowed to use Task.Run in an ASP.NET Core controller?是否允许在 ASP.NET Core 控制器中使用 Task.Run?
【发布时间】:2020-02-19 00:26:12
【问题描述】:

场景:我有一个带有“删除”ASP.NET Core 控制器操作的 Web 服务。该实现包括两个步骤:一个是廉价的,之后其他操作已经无法再看到已删除的数据,另一个是执行实际删除的长时间运行的第二个步骤。

是否可以使用Task.Run 进行第二次操作并且从不等待它并很快返回调用者?我知道这个任务可能会由于应用程序关闭而丢失,但它是否允许在 ASP.NET Core 中使用 Task.Run 将工作卸载到后台并且从不等待生成的任务?

【问题讨论】:

  • @Moho 后台任务用于应该一直运行的后台服务,例如,类似 cronjob 的任务。它们是 AFAIK,不适用于控制器的一次性工作。
  • 我们讨论了多久? 10秒? 1小时?一天?
  • 大约两到五分钟。但我对理论上的问题也很感兴趣。
  • @DR 你错了。检查Queued background tasks 部分。您还可以使用一些后台任务框架(例如 Hangfire)来支持后台任务的可扩展性,并在服务器停止和错误时重试。

标签: asp.net-core asp.net-core-2.1


【解决方案1】:

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

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

是否可以将 Task.Run 用于第二个操作并且从不等待它并很快返回调用者?

您说您知道该任务可能会在应用关闭时丢失。这是真的;因此,完全有可能永远不会发生第二次删除,并且不会有错误或日志消息通知您这一事实。此外,由于该任务被忽略,如果该任务失败将不会有任何通知,因此如果删除代码有问题,则不会有任何日志或任何内容通知您定期失败。如果您对此感到满意,那么使用即发即弃就可以了。

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

简单地忽略任务会起作用(不管有没有Task.Run),但这确实会产生负面影响,即 ASP.NET 根本不知道卸载的工作。所以我会推荐registering the task and having something delay the app shutdown until the tasks have a chance to complete。通过注册,仍然有可能丢失任务,但是注册它们可以减少丢失任务的机会。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多