Skip to content

Commit 9502d47

Browse files
committed
Add support for ConfigureAwait(false)
1 parent 4901204 commit 9502d47

50 files changed

Lines changed: 381 additions & 344 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

changelog.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,3 +36,7 @@ Initial version.
3636
- SelectManyAsync
3737
- SingleAsync
3838
- SingleOrDefaultAsync
39+
40+
## 1.3.0
41+
42+
Add support for ConfigureAwait(false)

src/AsyncLinqR/.editorconfig

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
[*.cs]
2+
# CA2007 : N’attendez pas directement une Tâche
3+
dotnet_diagnostic.CA2007.severity = error

src/AsyncLinqR/AggregateAsync.cs

Lines changed: 27 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,15 @@ public static partial class AsyncLinq
44
{
55
public static async Task<T> AggregateAsync<T>(this IAsyncEnumerable<T> source, Func<T, T, T> func, CancellationToken cancellationToken = default)
66
{
7-
await using var enumerator = source.GetAsyncEnumerator(cancellationToken);
8-
9-
if (!await enumerator.MoveNextAsync())
7+
var enumerator = source.GetAsyncEnumerator(cancellationToken);
8+
await using var disposableEnumerator = enumerator.ConfigureAwait(false);
9+
10+
if (!await enumerator.MoveNextAsync().ConfigureAwait(false))
1011
throw new InvalidOperationException("The sequence contains no element");
1112

1213
T current = enumerator.Current;
1314

14-
while (await enumerator.MoveNextAsync())
15+
while (await enumerator.MoveNextAsync().ConfigureAwait(false))
1516
current = func(current, enumerator.Current);
1617

1718
return current;
@@ -30,23 +31,24 @@ public static async Task<T> AggregateAsync<T>(this IEnumerable<T> source, Func<T
3031
while (enumerator.MoveNext())
3132
{
3233
cancellationToken.ThrowIfCancellationRequested();
33-
current = await func(current, enumerator.Current);
34+
current = await func(current, enumerator.Current).ConfigureAwait(false);
3435
}
3536

3637
return current;
3738
}
3839

3940
public static async Task<T> AggregateAsync<T>(this IAsyncEnumerable<T> source, Func<T, T, Task<T>> func, CancellationToken cancellationToken = default)
4041
{
41-
await using var enumerator = source.GetAsyncEnumerator(cancellationToken);
42+
var enumerator = source.GetAsyncEnumerator(cancellationToken);
43+
await using var disposableEnumerator = enumerator.ConfigureAwait(false);
4244

43-
if (!await enumerator.MoveNextAsync())
45+
if (!await enumerator.MoveNextAsync().ConfigureAwait(false))
4446
throw new InvalidOperationException("The sequence contains no element");
4547

4648
T current = enumerator.Current;
4749

48-
while (await enumerator.MoveNextAsync())
49-
current = await func(current, enumerator.Current);
50+
while (await enumerator.MoveNextAsync().ConfigureAwait(false))
51+
current = await func(current, enumerator.Current).ConfigureAwait(false);
5052

5153
return current;
5254
}
@@ -55,7 +57,7 @@ public static async Task<TAccumulate> AggregateAsync<TSource, TAccumulate>(this
5557
{
5658
var current = seed;
5759

58-
await foreach (var item in source.WithCancellation(cancellationToken))
60+
await foreach (var item in source.WithCancellation(cancellationToken).ConfigureAwait(false))
5961
current = func(current, item);
6062

6163
return current;
@@ -69,7 +71,7 @@ public static async Task<TAccumulate> AggregateAsync<TSource, TAccumulate>(this
6971
foreach (var item in source)
7072
{
7173
cancellationToken.ThrowIfCancellationRequested();
72-
current = await func(current, item);
74+
current = await func(current, item).ConfigureAwait(false);
7375
}
7476

7577
return current;
@@ -79,8 +81,8 @@ public static async Task<TAccumulate> AggregateAsync<TSource, TAccumulate>(this
7981
{
8082
var current = seed;
8183

82-
await foreach (var item in source.WithCancellation(cancellationToken))
83-
current = await func(current, item);
84+
await foreach (var item in source.WithCancellation(cancellationToken).ConfigureAwait(false))
85+
current = await func(current, item).ConfigureAwait(false);
8486

8587
return current;
8688
}
@@ -89,7 +91,7 @@ public static async Task<TResult> AggregateAsync<TSource, TAccumulate, TResult>(
8991
{
9092
var current = seed;
9193

92-
await foreach (var item in source.WithCancellation(cancellationToken))
94+
await foreach (var item in source.WithCancellation(cancellationToken).ConfigureAwait(false))
9395
current = func(current, item);
9496

9597
return resultSelector(current);
@@ -103,7 +105,7 @@ public static async Task<TResult> AggregateAsync<TSource, TAccumulate, TResult>(
103105
foreach (var item in source)
104106
{
105107
cancellationToken.ThrowIfCancellationRequested();
106-
current = await func(current, item);
108+
current = await func(current, item).ConfigureAwait(false);
107109
}
108110

109111
return resultSelector(current);
@@ -113,8 +115,8 @@ public static async Task<TResult> AggregateAsync<TSource, TAccumulate, TResult>(
113115
{
114116
var current = seed;
115117

116-
await foreach (var item in source.WithCancellation(cancellationToken))
117-
current = await func(current, item);
118+
await foreach (var item in source.WithCancellation(cancellationToken).ConfigureAwait(false))
119+
current = await func(current, item).ConfigureAwait(false);
118120

119121
return resultSelector(current);
120122
}
@@ -130,17 +132,17 @@ public static async Task<TResult> AggregateAsync<TSource, TAccumulate, TResult>(
130132
current = func(current, item);
131133
}
132134

133-
return await resultSelector(current);
135+
return await resultSelector(current).ConfigureAwait(false);
134136
}
135137

136138
public static async Task<TResult> AggregateAsync<TSource, TAccumulate, TResult>(this IAsyncEnumerable<TSource> source, TAccumulate seed, Func<TAccumulate, TSource, TAccumulate> func, Func<TAccumulate, Task<TResult>> resultSelector, CancellationToken cancellationToken = default)
137139
{
138140
var current = seed;
139141

140-
await foreach (var item in source.WithCancellation(cancellationToken))
142+
await foreach (var item in source.WithCancellation(cancellationToken).ConfigureAwait(false))
141143
current = func(current, item);
142144

143-
return await resultSelector(current);
145+
return await resultSelector(current).ConfigureAwait(false);
144146
}
145147

146148
public static async Task<TResult> AggregateAsync<TSource, TAccumulate, TResult>(this IEnumerable<TSource> source, TAccumulate seed, Func<TAccumulate, TSource, Task<TAccumulate>> func, Func<TAccumulate, Task<TResult>> resultSelector, CancellationToken cancellationToken = default)
@@ -151,19 +153,19 @@ public static async Task<TResult> AggregateAsync<TSource, TAccumulate, TResult>(
151153
foreach (var item in source)
152154
{
153155
cancellationToken.ThrowIfCancellationRequested();
154-
current = await func(current, item);
156+
current = await func(current, item).ConfigureAwait(false);
155157
}
156158

157-
return await resultSelector(current);
159+
return await resultSelector(current).ConfigureAwait(false);
158160
}
159161

160162
public static async Task<TResult> AggregateAsync<TSource, TAccumulate, TResult>(this IAsyncEnumerable<TSource> source, TAccumulate seed, Func<TAccumulate, TSource, Task<TAccumulate>> func, Func<TAccumulate, Task<TResult>> resultSelector, CancellationToken cancellationToken = default)
161163
{
162164
var current = seed;
163165

164-
await foreach (var item in source.WithCancellation(cancellationToken))
165-
current = await func(current, item);
166+
await foreach (var item in source.WithCancellation(cancellationToken).ConfigureAwait(false))
167+
current = await func(current, item).ConfigureAwait(false);
166168

167-
return await resultSelector(current);
169+
return await resultSelector(current).ConfigureAwait(false);
168170
}
169171
}

src/AsyncLinqR/AllAsync.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,16 @@ public static partial class AsyncLinq
44
{
55
public static async Task<bool> AllAsync<T>(this IAsyncEnumerable<T> source, Func<T, Task<bool>> predicate, CancellationToken cancellationToken = default)
66
{
7-
await foreach (var item in source.WithCancellation(cancellationToken))
8-
if (!await predicate(item))
7+
await foreach (var item in source.WithCancellation(cancellationToken).ConfigureAwait(false))
8+
if (!await predicate(item).ConfigureAwait(false))
99
return false;
1010

1111
return true;
1212
}
1313

1414
public static async Task<bool> AllAsync<T>(this IAsyncEnumerable<T> source, Func<T, bool> predicate, CancellationToken cancellationToken = default)
1515
{
16-
await foreach (var item in source.WithCancellation(cancellationToken))
16+
await foreach (var item in source.WithCancellation(cancellationToken).ConfigureAwait(false))
1717
if (!predicate(item))
1818
return false;
1919

@@ -25,7 +25,7 @@ public static async Task<bool> AllAsync<T>(this IEnumerable<T> source, Func<T, T
2525
foreach (var item in source)
2626
{
2727
cancellationToken.ThrowIfCancellationRequested();
28-
if (!await predicate(item))
28+
if (!await predicate(item).ConfigureAwait(false))
2929
return false;
3030
}
3131

src/AsyncLinqR/AnyAsync.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,24 +5,24 @@ public static partial class AsyncLinq
55
{
66
public static async Task<bool> AnyAsync<T>(this IAsyncEnumerable<T> source, CancellationToken cancellationToken = default)
77
{
8-
await foreach (var _ in source.WithCancellation(cancellationToken))
8+
await foreach (var _ in source.WithCancellation(cancellationToken).ConfigureAwait(false))
99
return true;
1010

1111
return false;
1212
}
1313

1414
public static async Task<bool> AnyAsync<T>(this IAsyncEnumerable<T> source, Func<T, Task<bool>> predicate, CancellationToken cancellationToken = default)
1515
{
16-
await foreach (var item in source.WithCancellation(cancellationToken))
17-
if (await predicate(item))
16+
await foreach (var item in source.WithCancellation(cancellationToken).ConfigureAwait(false))
17+
if (await predicate(item).ConfigureAwait(false))
1818
return true;
1919

2020
return false;
2121
}
2222

2323
public static async Task<bool> AnyAsync<T>(this IAsyncEnumerable<T> source, Func<T, bool> predicate, CancellationToken cancellationToken = default)
2424
{
25-
await foreach (var item in source.WithCancellation(cancellationToken))
25+
await foreach (var item in source.WithCancellation(cancellationToken).ConfigureAwait(false))
2626
if (predicate(item))
2727
return true;
2828

@@ -34,7 +34,7 @@ public static async Task<bool> AnyAsync<T>(this IEnumerable<T> source, Func<T, T
3434
foreach (var item in source)
3535
{
3636
cancellationToken.ThrowIfCancellationRequested();
37-
if (await predicate(item))
37+
if (await predicate(item).ConfigureAwait(false))
3838
return true;
3939
}
4040

src/AsyncLinqR/AppendAsync.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ public static partial class AsyncLinq
44
{
55
public static async IAsyncEnumerable<T> AppendAsync<T>(this IAsyncEnumerable<T> source, T item, [EnumeratorCancellation] CancellationToken cancellationToken = default)
66
{
7-
await foreach (var t in source.WithCancellation(cancellationToken))
7+
await foreach (var t in source.WithCancellation(cancellationToken).ConfigureAwait(false))
88
yield return t;
99

1010
yield return item;
@@ -19,14 +19,14 @@ public static async IAsyncEnumerable<T> AppendAsync<T>(this IEnumerable<T> sourc
1919
yield return t;
2020
}
2121

22-
yield return await item;
22+
yield return await item.ConfigureAwait(false);
2323
}
2424

2525
public static async IAsyncEnumerable<T> AppendAsync<T>(this IAsyncEnumerable<T> source, Task<T> item, [EnumeratorCancellation] CancellationToken cancellationToken = default)
2626
{
27-
await foreach (var t in source.WithCancellation(cancellationToken))
27+
await foreach (var t in source.WithCancellation(cancellationToken).ConfigureAwait(false))
2828
yield return t;
2929

30-
yield return await item;
30+
yield return await item.ConfigureAwait(false);
3131
}
3232
}

src/AsyncLinqR/CastAsync.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ public static partial class AsyncLinq
44
{
55
public static async IAsyncEnumerable<TResult> CastAsync<TSource, TResult>(this IAsyncEnumerable<TSource> source, [EnumeratorCancellation] CancellationToken cancellationToken = default) where TSource : notnull
66
{
7-
await foreach (var item in source.WithCancellation(cancellationToken))
7+
await foreach (var item in source.WithCancellation(cancellationToken).ConfigureAwait(false))
88
yield return (TResult)(object)item;
99
}
1010
}

src/AsyncLinqR/ChunkAsync.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ public static partial class AsyncLinq
55
public static async IAsyncEnumerable<T[]> ChunkAsync<T>(this IAsyncEnumerable<T> source, int size, [EnumeratorCancellation] CancellationToken cancellationToken = default)
66
{
77
var list = new List<T>();
8-
await foreach (var item in source.WithCancellation(cancellationToken))
8+
await foreach (var item in source.WithCancellation(cancellationToken).ConfigureAwait(false))
99
{
1010
list.Add(item);
1111
if (list.Count == size)

src/AsyncLinqR/ConcatAsync.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@ public static partial class AsyncLinq
44
{
55
public static async IAsyncEnumerable<T> ConcatAsync<T>(this IAsyncEnumerable<T> source1, IAsyncEnumerable<T> source2, [EnumeratorCancellation] CancellationToken cancellationToken = default)
66
{
7-
await foreach (var item in source1.WithCancellation(cancellationToken))
7+
await foreach (var item in source1.WithCancellation(cancellationToken).ConfigureAwait(false))
88
yield return item;
99

10-
await foreach (var item in source2.WithCancellation(cancellationToken))
10+
await foreach (var item in source2.WithCancellation(cancellationToken).ConfigureAwait(false))
1111
yield return item;
1212
}
1313
}

src/AsyncLinqR/CountAsync.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ public static partial class AsyncLinq
55
public static async Task<int> CountAsync<T>(this IAsyncEnumerable<T> source, CancellationToken cancellationToken = default)
66
{
77
int result = 0;
8-
await foreach (var _ in source.WithCancellation(cancellationToken))
8+
await foreach (var _ in source.WithCancellation(cancellationToken).ConfigureAwait(false))
99
result++;
1010

1111
return result;
@@ -14,8 +14,8 @@ public static async Task<int> CountAsync<T>(this IAsyncEnumerable<T> source, Can
1414
public static async Task<int> CountAsync<T>(this IAsyncEnumerable<T> source, Func<T, Task<bool>> predicate, CancellationToken cancellationToken = default)
1515
{
1616
int result = 0;
17-
await foreach (var t in source.WithCancellation(cancellationToken))
18-
if (await predicate(t))
17+
await foreach (var t in source.WithCancellation(cancellationToken).ConfigureAwait(false))
18+
if (await predicate(t).ConfigureAwait(false))
1919
result++;
2020

2121
return result;
@@ -24,7 +24,7 @@ public static async Task<int> CountAsync<T>(this IAsyncEnumerable<T> source, Fun
2424
public static async Task<int> CountAsync<T>(this IAsyncEnumerable<T> source, Func<T, bool> predicate, CancellationToken cancellationToken = default)
2525
{
2626
int result = 0;
27-
await foreach (var t in source.WithCancellation(cancellationToken))
27+
await foreach (var t in source.WithCancellation(cancellationToken).ConfigureAwait(false))
2828
if (predicate(t))
2929
result++;
3030

@@ -38,7 +38,7 @@ public static async Task<int> CountAsync<T>(this IEnumerable<T> source, Func<T,
3838
foreach (var t in source)
3939
{
4040
cancellationToken.ThrowIfCancellationRequested();
41-
if (await predicate(t))
41+
if (await predicate(t).ConfigureAwait(false))
4242
result++;
4343
}
4444

0 commit comments

Comments
 (0)