Безопасно ли использовать Microsoft.Extensions.Logging.ILogger
экземпляр внутри async void
(запустить и забыть), особенно тот, который подключен к пониманию приложения?
Конкретный сценарий c, о котором я думаю это когда задача запуска и записи пытается записать ошибку, но родительский контекст HTTP-запроса уже удален. Что происходит с этой телеметрией? Это просто работает, cra sh или не работает тихо?
Это настройка:
class Startup
{
public virtual void ConfigureServices(IServiceCollection services)
{
services.AddLogging(builder => builder.AddApplicationInsights());
services.AddApplicationInsightsTelemetry();
...
}
}
class MyCustomFilter : ActionFilterAttribute
{
private readonly ILogger _logger;
public MyCustomFilter(ILogger<MyCustomFilter> logger)
{
_logger = logger;
}
public override async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
{
await next().ConfigureAwait(false);
// do some other stuff
PublishEvents();
}
async void PublishEvents()
{
try
{
await PublishEventAsync().ConfigureAwait(false);
}
catch (Exception ex)
{
_logger.LogError(ex, "Something broke.");
}
}
}
Я знаю о ловушках использования огня и забыть, но это кажется законным применение. PublishEventAsync()
может занять несколько секунд, и HTTP-ответ в любом случае не зависит от результата. Если PublishEventAsync()
терпит неудачу, есть запланированное задание, которое повторяется, но в то же время мы хотим сделать sh событие как можно скорее.