如何在同一进程中创建ASP.NET Core宿主并发起请求
替代Thread.Sleep的ASP.NET Core应用托管与请求方案
直接依赖Thread.Sleep(1000)等待应用启动既不可靠(不同环境启动时间差异大)也不高效,推荐使用异步启动并等待应用就绪的方式,以下是优化后的完整实现:
using System; using System.Net.Http; using System.Threading.Tasks; using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.DependencyInjection; class Program { // 启用异步Main方法(需C# 7.1+,项目文件中设置<LangVersion>7.1</LangVersion>或更高版本) static async Task Main(string[] args) { const string BaseAddress = "http://localhost:5000"; var assemblyUnderTest = typeof(YourController).Assembly; // 替换为你的目标程序集 var builder = WebApplication.CreateBuilder(); builder.Services.AddControllers(); var app = builder.Build(); app.Urls.Add(BaseAddress); app.UseRouting(); app.MapControllers().AddApplicationPart(assemblyUnderTest); // 异步启动应用,会在服务完全就绪后返回,无需固定时长等待 await app.StartAsync(); try { // 使用HttpClient发起请求,用await替代.Result避免死锁与同步阻塞 using var client = new HttpClient(); var response = await client.GetAsync($"{BaseAddress}/subpath/key"); Console.WriteLine(response.StatusCode); Console.WriteLine(await response.Content.ReadAsStringAsync()); } finally { // 确保请求完成后停止应用,释放资源 await app.StopAsync(); } } }
核心优化点
- 异步启动与等待:
app.StartAsync()会异步等待Web服务完全就绪后返回,完全替代固定时长的Sleep,适配不同环境的启动速度。 - 异步请求处理:用
await替代.Result,避免同步上下文死锁,提升代码执行效率与可靠性。 - 资源安全释放:通过
using管理HttpClient,finally块确保应用无论请求结果如何都会被正确停止。
内容的提问来源于stack exchange,提问作者Yola
相关产品推荐
相关产品推荐

