在Startup.cs中异步(使用await)的最简单方法?网络API应用

时间:2019-07-02 22:21:28

标签: c# .net asp.net-core

我希望从Web api应用程序(Program.cs和Startup.cs)开始就可以轻松实现异步

这是做事的不好方法吗?我找不到简单的方法。 我想一直保持异步,这不是很容易吗?

换句话说,我想在Startup.cs文件中使用“等待”。

Startup.cs是默认模板的一部分,因此我不习惯替换它,但是也许还有另一种“异步”方式来做事。

这里的主要需求是,这样我就可以在Startup.cs逻辑期间调用KeyVault(GetSecretAsync),避免死锁线程问题。

2 个答案:

答案 0 :(得分:2)

您的意思不清楚,但ASP.NET Core本质上是异步的(默认情况下它会创建一个具有多个线程的线程池。)如果您希望各个API方法都是异步的,则只需要用这种方式编码。 MVC ControllerBase类支持异步操作方法,因此您所需要做的就是从操作方法中返回Task<IActionResult>而不是IActionResult。在Program.cs或Startup.cs中无需更改即可启用该功能。

也没有办法强制所有动作方法都是异步的,这也不是一个好主意。固有地将在单个线程上执行的操作(并且没有长时间的IO等待)最好阻止该线程,直到它们返回为止,否则最终将导致很多非常昂贵的上下文切换而没有任何好处。

如果要在Program或Startup类中执行要并行化的操作,则可以使用Task和/或Threading库执行此操作,并阻塞直到所有并行任务完成。但是,在启动时需要做很多工作是非常不寻常的,并且建议您可能需要对设计进行一些重新思考。

最后,如果您要创建连续运行的后台任务,则ASP.NET Core中唯一的机制是HostedService。但是取决于您要完成的工作,ASP.NET Core可能只是该工作的错误工具。

答案 1 :(得分:2)

您需要做的只是在csproj文件中,将LangVersion设置为7.1。如果愿意,也可以使用Latest

<PropertyGroup>
  <LangVersion>7.1</LangVersion>
</PropertyGroup>

然后使Main方法异步

static async Task Main(string[] args) {
  //some async code goes here
}