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

如何在.NET Core应用中无需Sleep确保New Relic Agent完全连接?

如何在.NET Core应用中无需Sleep等待New Relic Agent完全连接?

我正在将New Relic集成至.NET Core应用中,目前遇到一种场景:服务需等待New Relic Agent完全连接后才能继续执行。当前我使用3秒静态Sleep来确保Agent就绪,且所有日志可正常上报至New Relic。

以下是我的Program.cs代码:

private static void InitNewRelic()
{
    var version = Assembly.GetExecutingAssembly().GetName().Version;
    var newRelicSettings = new NewRelicSettings("my-app-webjob", version, "NewRelic");
    NewRelic.Api.Agent.NewRelic.RecordCustomEvent(newRelicSettings.EventType, new[]
    {
        new KeyValuePair<string, object>("Version", newRelicSettings.Version)
    });
    Target.Register<NewRelicTarget>(newRelicSettings.TargetName);
    WaitUntilNewRelicAgentIsFullyConnected();
}

private static void WaitUntilNewRelicAgentIsFullyConnected()
{
    Thread.Sleep(3000);
}

请问是否存在无需使用Sleep的更高效处理方式?我希望确保New Relic Agent完全连接后再执行应用逻辑。


解决方案

方法1:轮询Agent连接状态API

New Relic .NET Agent提供了NewRelic.Api.Agent.NewRelic.AgentConnected属性,可通过短间隔轮询替代固定时长Sleep,一旦检测到连接成功就立即继续执行,同时设置超时避免无限阻塞:

private static void WaitUntilNewRelicAgentIsFullyConnected()
{
    var timeout = TimeSpan.FromSeconds(10); // 自定义超时时间
    var startTime = DateTime.UtcNow;
    
    while (!NewRelic.Api.Agent.NewRelic.AgentConnected)
    {
        if (DateTime.UtcNow - startTime > timeout)
        {
            // 超时处理:记录日志或执行降级逻辑
            break;
        }
        Thread.Sleep(100); // 短间隔轮询,减少资源消耗
    }
}

方法2:利用异步轮询适配.NET Core异步模型

如果应用采用异步编程,可改用Task.Delay实现非阻塞轮询,避免阻塞主线程:

private static async Task WaitUntilNewRelicAgentIsFullyConnectedAsync()
{
    var timeout = TimeSpan.FromSeconds(10);
    var startTime = DateTime.UtcNow;
    
    while (!NewRelic.Api.Agent.NewRelic.AgentConnected)
    {
        if (DateTime.UtcNow - startTime > timeout)
        {
            break;
        }
        await Task.Delay(100);
    }
}

调用时需将InitNewRelic改为异步方法并使用await。

方法3:结合HostedService实现启动阶段等待(ASP.NET Core专属)

如果是ASP.NET Core应用,可将Agent等待逻辑封装到IHostedService中,利用应用启动生命周期完成等待,不阻塞主线程:

public class NewRelicInitHostedService : IHostedService
{
    public async Task StartAsync(CancellationToken cancellationToken)
    {
        var timeout = TimeSpan.FromSeconds(10);
        var startTime = DateTime.UtcNow;
        
        while (!NewRelic.Api.Agent.NewRelic.AgentConnected && !cancellationToken.IsCancellationRequested)
        {
            if (DateTime.UtcNow - startTime > timeout)
            {
                break;
            }
            await Task.Delay(100, cancellationToken);
        }
        
        // 在此执行需要等待Agent就绪后的业务逻辑
    }

    public Task StopAsync(CancellationToken cancellationToken) => Task.CompletedTask;
}

然后在主机构建时注册服务:

builder.Services.AddHostedService<NewRelicInitHostedService>();

内容的提问来源于stack exchange,提问作者NewHouses

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 02:52:13