static async Task <IExceptionHandler> AwaitedCreate( ExceptionMappingSchemeRegistration scheme, IServiceProvider serviceProvider) { var handler = scheme.HandlerFactory(serviceProvider); await handler.InitializeAsync(scheme.Name); return(handler); }
public Task <IExceptionHandler> GetHandlerAsync(ExceptionMappingSchemeRegistration scheme) { if (scheme == null) { throw new ArgumentNullException(nameof(scheme)); } Task <IExceptionHandler>?handlerTask; lock (_lock) { // Happy path: get from cache. if (!_cache.TryGetValue(scheme.Name, out handlerTask)) { // Slow path: create the handler and initialize it // The handler task may complete synchronously here handlerTask = AwaitedCreate(scheme, _serviceProvider); _cache.Add(scheme.Name, handlerTask); } } return(handlerTask);