diff --git a/Orm/Xtensive.Orm/Orm/Domain.cs b/Orm/Xtensive.Orm/Orm/Domain.cs index be60c8e524..c291ca4e34 100644 --- a/Orm/Xtensive.Orm/Orm/Domain.cs +++ b/Orm/Xtensive.Orm/Orm/Domain.cs @@ -436,41 +436,49 @@ internal Domain(DomainConfiguration configuration, object upgradeContextCookie, public ValueTask DisposeAsync() => InnerDispose(true); - public ValueTask InnerDispose(bool isAsync) + public async ValueTask InnerDispose(bool isAsync) { lock (disposeGuard) { if (isDisposed) { - return default; + return; } isDisposed = true; + } - if (isDebugEventLoggingEnabled) { - OrmLog.Debug(Strings.LogDomainIsDisposing); - } + if (isDebugEventLoggingEnabled) { + OrmLog.Debug(Strings.LogDomainIsDisposing); + } - NotifyDisposing(); - Services.Dispose(); + NotifyDisposing(); + Services.Dispose(); - if (SingleConnection==null) { - return default; - } + if (SingleConnection == null) { + return; + } - // TODO: implement async dispose of the SingleConnection - lock (singleConnectionGuard) { - if (singleConnectionOwner==null) { - var driver = Handlers.StorageDriver; - driver.CloseConnection(null, SingleConnection); - driver.DisposeConnection(null, SingleConnection); - } - else { - OrmLog.Warning( - Strings.LogUnableToCloseSingleAvailableConnectionItIsStillUsedBySessionX, - singleConnectionOwner); - } + SqlConnection singleConnectionLocal; + lock (singleConnectionGuard) { + if (singleConnectionOwner != null) { + OrmLog.Warning( + Strings.LogUnableToCloseSingleAvailableConnectionItIsStillUsedBySessionX, + singleConnectionOwner); + return; + } + else { + singleConnectionLocal = SingleConnection; + SingleConnection = null; } + } - return default; + var driver = Handlers.StorageDriver; + if (isAsync) { + await driver.CloseConnectionAsync(null, singleConnectionLocal).ConfigureAwait(false); + await driver.DisposeConnectionAsync(null, singleConnectionLocal).ConfigureAwait(false); + } + else { + driver.CloseConnection(null, singleConnectionLocal); + driver.DisposeConnection(null, singleConnectionLocal); } } }