调用存储过程,不要等待响应

时间:2018-06-09 20:49:05

标签: c# asynchronous async-await petapoco

我找不到有关此类问题的最新帖子。所以,再问这个。

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

这是我的问题:我不想等待执行完成。所以试图使用异步和等待。但我无法使其发挥作用。我们是否需要异步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
}

由于

1 个答案:

答案 0 :(得分:2)

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

然而,这有几个危险。

首先,如果抛出异常,则没有任务句柄来返回该异常,并且调用代码不会知道该异常。

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

第三,它有点混乱和意外。它可能导致可维护性问题。

如果可能的话,最好将后台处理移动到类似外部队列的位置,因为如果发生瞬时故障,您可以安全地重试该操作。 ASP.NET中从不推荐长时间运行的后台任务。如果无法做到这一点,可能需要考虑优化数据库调用的性能,或者最后,只需阻止响应直到查询完成。