在 Startup.cs 中使 ConfigureServices 方法异步

Posted

技术标签:

【中文标题】在 Startup.cs 中使 ConfigureServices 方法异步【英文标题】:Make the ConfigureServices method async in Startup.cs 【发布时间】:2016-06-01 15:40:27 【问题描述】:

我需要在 Startup.cs 的 ConfigureServices 中添加几个等待函数,但遇到了问题。

System.InvalidOperationException 找不到所需的服务。请通过在应用程序启动代码中对“IApplicationBuilder.ConfigureServices(...)”或“IApplicationBuilder.UseMvc(...)”的调用中调用“IServiceCollection.AddMvc()”来添加所有必需的服务。

从下面的代码中可以看出,AddMvc 和 UseMvc 位于正确的位置,但是,我仍然收到此错误。

public async void ConfigureServices(IServiceCollection services)

    ...
    await manager.Initialize();
    var data = await manager.GetData();
    ...
    services.AddMvc();


public void Configure(IApplicationBuilder app, IHostingEnvironment env,ILoggerFactory loggerFactory)

    ...
    app.UseMvc();
    ....

是否可以使 ConfigureServices 成为异步函数?

【问题讨论】:

类似问题的实际答案不仅仅是“不!” ;-) ***.com/questions/56077346/… 【参考方案1】:

不,你不能。这样做会导致竞争条件。

相反,请考虑使您的操作同步或使用.Wait()/.Result(取决于异步方法是否返回数据)阻塞直到异步任务完成。

【讨论】:

你能解释一下为什么会出现竞态条件吗?在这里更深入一点,更好地了解什么时候执行会很棒。 请添加一些关于“竞争条件”的解释 @MaviDomates,@Vencovsky,因为ConfigureServicesIHostBuilder 中的底层代码继续处理主机启动的其余部分,而不等待您的特定异步实现,所以出现了竞争条件。这是因为ConfigureServices 接受Action 委托,它不返回Task 或任何可等待的东西。就构建器而言,它已经执行了你的方法并完成了它的工作。 不要使用Wait()Result()。如果您觉得必须,至少使用GetAwaiterGetResult。但总的来说,这是不好的做法,因为您可能会遇到死锁或线程池饥饿的风险。 link 相当肯定 GetAwaiter() 只是将任务包装在等待者中,而等待者上的 GetResult() 只是调用 Result 属性,如果任务未完成,该属性将调用 Wait() ......唯一真正的好处是异常如何传播。 GetAwaiter() 实际上并不打算供您使用(参考:docs.microsoft.com/en-us/dotnet/api/…)

以上是关于在 Startup.cs 中使 ConfigureServices 方法异步的主要内容,如果未能解决你的问题,请参考以下文章

.net core 在Startup.cs 的Configure方法中扩展 IApplicationBuilder

文件路径在startup.cs的Configure方法中写入

在 Startup.cs 中初始化 Blob 存储

Core的Session基本使用

Configure中间件与ErrorHandlingMiddleware全局异常捕获

ASP .NET MVC 5 中使用的 Startup.Auth.cs 和 Startup.cs 是啥?