首页 > 解决方案 > 调用存储过程,不等待响应

问题描述

我找不到有关此类问题的任何最新帖子。于是,又问了一遍。

我正在使用 ASP.NET MVC、petapoco ORM 将值保存到数据库中。每当我保存实体时,我都会为搜索功能生成一个元标记并将其存储在不同的表中。该存储过程大约需要 5 秒才能执行。

这是我的问题:我不想等待执行完成。所以尝试使用异步和等待。但我无法让它工作。我们是否需要 async petapoco 数据库调用才能使其工作,或者仅 async 关键字就足够了。在每个教程中,我都观察了他们在异步函数中使用异步内置函数的异步。所以我不确定如何为这个要求设置异步。有什么建议么?

public ActionResult Save(entityModel model)
{
    //save model
    SaveEntity(model);

    //Generate metatag and store it in separate table.
    GenerateMetatag(model.id);

    return view(model);
}

public void GenerateMetatag(int id)
{
    //call stored procedure
}

谢谢

标签: c#asynchronousasync-awaitpetapoco

解决方案


如果您重组代码以使用 async/await,您可以选择不等待任务,然后继续在后台运行。

但是,这样做有几个危险。

首先,如果抛出异常,则没有任务句柄可以将该异常返回到,调用代码将不会意识到该异常。

其次,如果 IIS 实例在执行过程中重新启动,您的任务就会丢失。对于 ASP.NET 上下文,这不一定非典型,但不能完全保证完全执行。

第三,它有点令人困惑和出乎意料。它可能会导致未来的可维护性问题。

如果可能的话,最好将后台处理移至外部队列之类的地方,因为如果出现暂时性故障,您可以安全地重试该操作。在 ASP.NET 中从不推荐长时间运行的后台任务。如果这不可能,则可能需要考虑优化数据库调用的性能,或者最后,简单地阻塞响应直到查询完成。


推荐阅读