我找不到有关此类问题的最新帖子。所以,再问这个。
我正在使用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
}
由于
答案 0 :(得分:2)
如果您重新构建代码以使用async / await,您可以选择不等待该任务,然后该任务将继续在后台运行。
然而,这有几个危险。
首先,如果抛出异常,则没有任务句柄来返回该异常,并且调用代码不会知道该异常。
其次,如果IIS实例在执行过程中重新启动,则您的任务将丢失。对于ASP.NET上下文而言,这不一定是非典型的,但完全执行并不能完全保证。
第三,它有点混乱和意外。它可能导致可维护性问题。
如果可能的话,最好将后台处理移动到类似外部队列的位置,因为如果发生瞬时故障,您可以安全地重试该操作。 ASP.NET中从不推荐长时间运行的后台任务。如果无法做到这一点,可能需要考虑优化数据库调用的性能,或者最后,只需阻止响应直到查询完成。