C# 控制器操作中的长时间运行方法-MVC

C# 控制器操作中的长时间运行方法-MVC,c#,.net,asp.net-mvc,asp.net-web-api,asp.net-web-api2,C#,.net,Asp.net Mvc,Asp.net Web Api,Asp.net Web Api2,我在WebAPI-MVC public IActionResult Post(Model model) { ALongRunningMethod(); return Ok(); } 我有两个选择 等待方法完成。但是,如果它太长怎么办?API不是超时了吗 使用Tasks在单独的线程中运行,但立即返回Ok(200 HTTP代码)?如果在长时间运行的方法中出现异常,该怎么办 完全糊涂了。在这种情况下我应该怎么做?从.Net 4.5.2开始,您现在必须在ASP.Net中处理长时

我在
WebAPI-MVC

public IActionResult Post(Model model)
{
      ALongRunningMethod();
      return Ok();
}
我有两个选择

  • 等待方法完成。但是,如果它太长怎么办?API不是超时了吗
  • 使用
    Tasks
    在单独的线程中运行,但立即返回
    Ok(200 HTTP代码)
    ?如果在长时间运行的方法中出现异常,该怎么办

  • 完全糊涂了。在这种情况下我应该怎么做?

    从.Net 4.5.2开始,您现在必须在ASP.Net中处理长时间运行的操作。

    这是web应用程序中的常见问题。我将创建一个
    GUID
    ,将其传递到任务中,运行任务,并传回
    GUID
    。与此同时,这项任务将继续下去。如果您有一个数据库,您可以从任务中将
    GUID
    保存到数据库中,以指示某些状态。e、 g.您可以有一个名为“Task”的数据库表,其中包含列
    TaskID
    Status

    然后,您可以使用
    GUID
    定期检索(轮询)任务的状态


    评论者说ASP.NET中长时间运行的任务是一个危险的游戏,这是正确的,因为你无法控制应用程序域的生命周期。

    处理这一问题的最佳方法是使用单独的服务来实际执行你想要运行的任务,而不是从web api控制器中运行它们

    让Web API端点向数据库写入一个条目,请求完成一些工作,并让另一个单独的服务从该表中读取并执行那些长时间运行的任务

    当然,您可以提供某种id,以便在WEB API中使用另一个端点查询进度(如果您愿意)

    造成这种情况以及您可能会遇到的问题的原因是,ASP.NET只知道与请求相关联的代码运行,,您希望在后台线程中运行的代码不会被视为请求的一部分,因此可能会在多个原因中的任意一点结束

    以下是这些风险的一些示例:

  • 与请求无关的线程中的未处理异常将关闭进程
  • 如果您在Web场中运行站点,您可能会得到多个应用程序实例,这些实例都试图同时运行同一任务
  • 您的站点运行的AppDomain可能由于多种原因而停止运行,并随之停止您的后台任务。如果在代码执行过程中发生这种情况,可能会损坏数据。
  • 有关更多信息,请参阅本页:


    希望这能有所帮助。

    WEB API不是基于这样一种假设:一旦没有请求运行,它就可以中断和终止进程吗?这意味着无法保证您的进程会完成。这是真的,但是,如果您懒惰或不关心代码是否完成,则基础模式是有用的。基础模式是调用异步操作,传入唯一令牌,然后轮询状态。懒惰不在其中。@BenjaminPaul我已经承认了你在回答中的观点。关于如何在ASP.NET中运行长时间运行的任务,有很多问题。分享你的研究成果将有助于我们缩小最佳答案的范围;“完全困惑”则不然。我知道你的问题是关于何时返回以及返回什么,但是如果你以正确的方式执行后台任务,你就不会有这个问题。从操作中立即返回不是这里的目标,这不是async的目的。它更重要的是,在发生耗时的调用时不要阻塞WebAPI,并将它们委托给后台线程,这样WebAPI就可以接受另一个请求。您仍应等待操作完成并返回真实状态:-)