如何在.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
相关产品推荐
相关产品推荐

