首页 > 解决方案 > 执行存储过程而不等待结果(Angular/.net core 2)

问题描述

我正在使用前端 Angular 6 和后端 .net core 2 的应用程序工作。

我希望,如果在某种情况下,执行存储在数据库(MySQL)中的过程,无论用户继续做什么,都需要几分钟才能执行。我不需要从该过程中收集任何结果。

我如何以这种方式启动它,无论用户做什么都继续运行,即使他关闭了浏览器?

我尝试了几种方法...

 [HttpGet]
 [Route("Check/{idCheck}")]
 public async Task ComprobarDatos(int idCheck)
 {
      try
      {
         int? timeout = _context.Database.GetCommandTimeout();
         _context.Database.SetCommandTimeout(600);
         await _context.Database.ExecuteSqlCommandAsync("call CheckProcess({0});", idCheck)
                    .ConfigureAwait(false);
         if(timeout!= null && timeout > 0)
         {
            _context.Database.SetCommandTimeout(timeout);
         }
      }
      catch (Exception ex)
      {
         _logger.LogError("Ocurrió un problema ejecutando el procedimiento CheckProcesscon id {0}: " + ex.Message, idCheck);
      }
 }

我也试过:

public IActionResult ...
...
_context.Database.ExecuteSqlCommand("call CheckProcess({0});", idCheck);
return Ok();

和:

public IActionResult ...
...
_context.Database.ExecuteSqlCommandAsync("call CheckProcess({0});", idCheck)
.ConfigureAwait(false);
return Ok();

和:

public IActionResult ...
...
_context.Database.ExecuteSqlCommandAsync("call CheckProcess({0});", idCheck)
.ConfigureAwait(true);
return Ok();

它总是等待存储过程完成才能继续执行代码。

谢谢!

标签: mysqlangularasp.net-core

解决方案


您可以通过使用后台服务器任务来实现这一点。

  • 在每个请求上启动一个新的后台任务和return
  • 后台任务执行存储过程

推荐阅读