我需要在启动时在 ASP .Net Core 3.1 Web API 中执行异步方法

Posted

技术标签:

【中文标题】我需要在启动时在 ASP .Net Core 3.1 Web API 中执行异步方法【英文标题】:I need to execute an async method at startup in an ASP .Net Core 3.1 Web API 【发布时间】:2020-12-09 08:22:06 【问题描述】:

我有一个 ASP .Net Core 3.1 Web API。当 API 启动时,我希望它从数据库中读取几个查找表并将它们存储在某个地方。这些表包含很少更改的数据(标题、国家、语言等)。这些数据可能每隔几年更改一次。因此,我希望它们在启动时被读取和存储以提高性能,而不是每次我需要这些数据时都读取数据库。

我所做的是创建一个读取所有这些查找表的服务。然后,在服务的构造函数中,我调用服务中的一个方法,该方法从数据库中进行实际读取。然后我在 Startup.ConfigureServices() 中将此服务注册为 Singleton。

问题是读取数据库表的方法是异步的,构造函数不能是异步的(据我了解)。

目前,它正在工作 - 该方法在服务的构造函数中调用,然后立即返回,而数据库表的读取发生在一个单独的进程中。无论如何,实际读数只需要一两秒钟。然而,我不喜欢这样。可以运行另一个需要访问此查找数据的代码,但数据可能尚未准备好。理想情况下,我希望在执行任何其他代码之前完成对这些查找表的读取。此外,我在 VS 中得到一条绿色的摆动线,并对此发出警告:)

所以我不确定如何解决它。是否有在 .Net Core API 中启动时执行代码的最佳实践?

【问题讨论】:

【参考方案1】:

您可以在 main 方法中执行此操作。由于 C# 7.1 可以应用程序入口点返回任务。

看看这个例子。他在 main 方法中运行他的迁移(但他提到它有点混乱,所以您可以使用文章中描述的另一种方法)。我认为您可以以相同的方式加载数据。

https://andrewlock.net/running-async-tasks-on-app-startup-in-asp-net-core-part-2/

【讨论】:

以上是关于我需要在启动时在 ASP .Net Core 3.1 Web API 中执行异步方法的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ASP.NET CORE 5.0 MVC 中将登录设置为默认路由

ASP.NET Core 3.1 - HTTP 错误 500.30 - ANCM 进程内启动失败

Dotnet 在 Mac ASP.NET Core 3 上意外退出

源码解读asp.net core源码启动流程精细解读

细说.net core Startup

如何从 Asp.NET Core 3.1 启动类访问 launchSettings.json 中的 `applicationUrl` 属性?