You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在同一进程中创建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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 10:20:19