ASP. NET Ядро: ведение журнала из задачи "забыл и забыл" (asyn c void метод) - PullRequest
0 голосов
/ 19 февраля 2020

Безопасно ли использовать 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 событие как можно скорее.

...