【问题标题】:Make the ConfigureServices method async in Startup.cs在 Startup.cs 中使 ConfigureServices 方法异步
【发布时间】: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 成为异步函数?

【问题讨论】:

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


【解决方案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/…
猜你喜欢
  • 2015-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-01
  • 2017-05-15
  • 2021-02-21
  • 1970-01-01
相关资源
最近更新 更多