Skip to content

Commit 2d33dea

Browse files
authored
Merge pull request #453 from DataObjects-NET/7.2-fix-asyncenumerable-disposal
Addresses issue of not disposing IAsyncEnumerator which causes query being open
2 parents a7d5320 + 4139e26 commit 2d33dea

3 files changed

Lines changed: 16 additions & 5 deletions

File tree

ChangeLog/7.2.1-dev.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
1-
[main] Added Query.SingleAsync()/SingleOrDefaultAsync and QueryEndpoint.SingleAsync()/SingleOrDefaultAsync methods
1+
[main] Added Query.SingleAsync()/SingleOrDefaultAsync and QueryEndpoint.SingleAsync()/SingleOrDefaultAsync methods
2+
[main] Addressed issue of not disposing IAsyncEnumerator which caused query being open

Orm/Xtensive.Orm/Orm/Providers/CommandProcessing/DataReader.cs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,16 @@ public async ValueTask DisposeAsync()
9595
await command.DisposeAsync().ConfigureAwait(false);
9696
}
9797
else {
98-
await ((IAsyncEnumerator<Tuple>) source).DisposeAsync().ConfigureAwait(false);
98+
if (source is IAsyncEnumerator<Tuple> asyncSource) {
99+
// true async enumerable source
100+
await asyncSource.DisposeAsync().ConfigureAwait(false);
101+
}
102+
else {
103+
// preloaded collection of elements,
104+
// like in case of delayed query which has already been read from database
105+
// or greedy enumeration
106+
((IEnumerator<Tuple>) source).Dispose();
107+
}
99108
}
100109
}
101110

Orm/Xtensive.Orm/Orm/QueryResult.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,9 +54,10 @@ public IEnumerator<TItem> GetEnumerator()
5454
public async IAsyncEnumerable<TItem> AsAsyncEnumerable()
5555
{
5656
EnsureResultsAlive();
57-
var enumerator = reader.AsAsyncEnumerator();
58-
while (await enumerator.MoveNextAsync().ConfigureAwait(false)) {
59-
yield return enumerator.Current;
57+
await using (var enumerator = reader.AsAsyncEnumerator()) {
58+
while (await enumerator.MoveNextAsync().ConfigureAwait(false)) {
59+
yield return enumerator.Current;
60+
}
6061
}
6162
}
6263

0 commit comments

Comments
 (0)