【发布时间】:2023-04-04 03:10:01
【问题描述】:
我有一个触发后忘记的任务,我需要报告一些遥测数据,无论任务是否成功(这就是触发后忘记的原因),但我需要确保它不会阻塞api 调用。
当遥测任务中出现异常时,我会记录该异常。
我的代码是这样的:
public class MyService : IMyService
{
private readonly IReporter reporter;
private static readonly Logger logger = LogManager.GetCurrentClassLogger();
public MyService (IReporter reporter){
}
//..
public Task<Result> processorRequest()
{
// ...
_ = Task.Run(() =>
{
reportTelemetry();
});
//...
}
private void reportTelemetry()
{
try
{
reporter.Report();
}
catch (Exception ex)
{
logger.Warn($"An exception was raised while reporting: {ex.Message}");
}
}
}
记录器是在顶部创建的,如下所示:
private static readonly Logger logger = LogManager.GetCurrentClassLogger();
MyService 和 Reporter 被创建并注入到具有 transient 生命周期的容器中。
我的问题是:
新线程中对 logger 的引用会阻止 MyService/Reporter 被收集吗?或者 GC 会在调用 logger.Warn 之前就决定释放服务吗?
我是否会因为某种原因(除了应用关闭)而不报告异常情况?
非常感谢任何帮助。
【问题讨论】:
标签: c# multithreading logging task unity-container