如何实现线程顺序执行?确保AWSConfigurator先于Startup初始化
问题分析与解决方案
当前实现的问题
原代码中,ConfigureAppConfiguration使用了异步委托,但ASP.NET Core的配置初始化阶段不支持异步等待逻辑。这会导致AWSConfigurator.ConfigureBuilderAsync还未完成AWS参数存储的请求(获取数据库连接字符串),程序就已经进入Startup的初始化流程,最终日志输出空的连接字符串。
原Program.cs代码
public class Program { static void Main(string[] args) { CreateWebHostBuilder(args).Build().Run(); } public static IHostBuilder CreateWebHostBuilder(string[] args) { return Host.CreateDefaultBuilder(args).UseServiceProviderFactory(new AutofacServiceProviderFactory()) .ConfigureWebHostDefaults(webBuilder => { webBuilder.ConfigureAppConfiguration(async (hostbuilder, builder) => { var configuration = await AWSConfigurator.ConfigureBuilderAsync(builder); builder.AddConfiguration(configuration); }); webBuilder.UseStartup<Startup>(); webBuilder.UseContentRoot(Directory.GetCurrentDirectory()); }); } }
AWSConfigurator核心代码片段
var request = new GetParameterRequest() { Name = $"/development/MYAPP/ConnectionString" };
解决方案
将异步配置调用改为同步等待,通过.Result强制等待AWSConfigurator.ConfigureBuilderAsync执行完成,确保配置加载完毕后再进入Startup阶段。此场景下使用.Result不会引发死锁,因为宿主启动的配置阶段尚未建立同步上下文。
修改后的Program.cs代码
return Host.CreateDefaultBuilder(args).UseServiceProviderFactory(new AutofacServiceProviderFactory()) .ConfigureWebHostDefaults(webBuilder => { webBuilder.ConfigureAppConfiguration((hostbuilder, builder) => { var configuration = AWSConfigurator.ConfigureBuilderAsync(builder).Result; builder.AddConfiguration(configuration); }); webBuilder.UseStartup<Startup>(); webBuilder.UseContentRoot(Directory.GetCurrentDirectory()); });
内容的提问来源于stack exchange,提问作者Jakub Jabłoński
相关产品推荐
相关产品推荐

