Skip to content

Commit 87de169

Browse files
authored
Add .ConfigureAwait(false) to awaited calls (#290)
1 parent 25b4f6d commit 87de169

File tree

9 files changed

+79
-79
lines changed

9 files changed

+79
-79
lines changed

src/CacheTower.Extensions.Redis/RedisLockExtension.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,8 @@ public void Register(ICacheStack cacheStack)
7070
private async ValueTask ReleaseLockAsync(string cacheKey)
7171
{
7272
var lockKey = string.Format(Options.KeyFormat, cacheKey);
73-
await Subscriber.PublishAsync(GetRedisChannel(), cacheKey, CommandFlags.FireAndForget);
74-
await Database.KeyDeleteAsync(lockKey, CommandFlags.FireAndForget);
73+
await Subscriber.PublishAsync(GetRedisChannel(), cacheKey, CommandFlags.FireAndForget).ConfigureAwait(false);
74+
await Database.KeyDeleteAsync(lockKey, CommandFlags.FireAndForget).ConfigureAwait(false);
7575
UnlockWaitingTasks(cacheKey);
7676
}
7777

@@ -86,7 +86,7 @@ private async ValueTask SpinWaitAsync(TaskCompletionSource<bool> taskCompletionS
8686
var lockExists = await Database.KeyExistsAsync(lockKey).ConfigureAwait(false);
8787
if (lockExists)
8888
{
89-
await Task.Delay(Options.LockCheckStrategy.SpinTime);
89+
await Task.Delay(Options.LockCheckStrategy.SpinTime).ConfigureAwait(false);
9090
continue;
9191
}
9292

@@ -107,7 +107,7 @@ private async ValueTask DelayWaitAsync(TaskCompletionSource<bool> taskCompletion
107107
public async ValueTask<DistributedLock> AwaitAccessAsync(string cacheKey)
108108
{
109109
var lockKey = string.Format(Options.KeyFormat, cacheKey);
110-
var hasLock = await Database.StringSetAsync(lockKey, RedisValue.EmptyString, expiry: Options.LockTimeout, when: When.NotExists);
110+
var hasLock = await Database.StringSetAsync(lockKey, RedisValue.EmptyString, expiry: Options.LockTimeout, when: When.NotExists).ConfigureAwait(false);
111111

112112
if (hasLock)
113113
{
@@ -132,13 +132,13 @@ public async ValueTask<DistributedLock> AwaitAccessAsync(string cacheKey)
132132
});
133133

134134
//Last minute check to confirm whether waiting is required (in case the notification is missed)
135-
if (!await Database.KeyExistsAsync(lockKey))
135+
if (!await Database.KeyExistsAsync(lockKey).ConfigureAwait(false))
136136
{
137137
UnlockWaitingTasks(cacheKey);
138138
return DistributedLock.Unlocked(cacheKey);
139139
}
140140

141-
await completionSource.Task;
141+
await completionSource.Task.ConfigureAwait(false);
142142
return DistributedLock.Unlocked(cacheKey);
143143
}
144144
}

src/CacheTower.Extensions.Redis/RedisRemoteEvictionExtension.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ private async ValueTask FlagEvictionAsync(string cacheKey)
7272
FlaggedEvictions.Add(cacheKey);
7373
}
7474

75-
await Subscriber.PublishAsync(EvictionChannel, cacheKey, CommandFlags.FireAndForget);
75+
await Subscriber.PublishAsync(EvictionChannel, cacheKey, CommandFlags.FireAndForget).ConfigureAwait(false);
7676
}
7777

7878
/// <remarks>
@@ -86,7 +86,7 @@ public async ValueTask OnCacheFlushAsync()
8686
HasFlushTriggered = true;
8787
}
8888

89-
await Subscriber.PublishAsync(FlushChannel, RedisValue.EmptyString, CommandFlags.FireAndForget);
89+
await Subscriber.PublishAsync(FlushChannel, RedisValue.EmptyString, CommandFlags.FireAndForget).ConfigureAwait(false);
9090
}
9191

9292
/// <inheritdoc/>
@@ -122,7 +122,7 @@ public void Register(ICacheStack cacheStack)
122122
var cacheLayer = cacheLayers[i];
123123
if (cacheLayer is ILocalCacheLayer)
124124
{
125-
await cacheLayer.EvictAsync(cacheKey);
125+
await cacheLayer.EvictAsync(cacheKey).ConfigureAwait(false);
126126
}
127127
}
128128
}
@@ -146,7 +146,7 @@ public void Register(ICacheStack cacheStack)
146146
var cacheLayer = cacheLayers[i];
147147
if (cacheLayer is ILocalCacheLayer)
148148
{
149-
await cacheLayer.FlushAsync();
149+
await cacheLayer.FlushAsync().ConfigureAwait(false);
150150
}
151151
}
152152
}

src/CacheTower.Providers.Database.MongoDB/MongoDbCacheLayer.cs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -46,34 +46,34 @@ private async ValueTask TryConfigureIndexes()
4646
if (!HasSetIndexes)
4747
{
4848
HasSetIndexes = true;
49-
await EntityIndexWriter.ApplyIndexingAsync<DbCachedEntry>(Connection);
49+
await EntityIndexWriter.ApplyIndexingAsync<DbCachedEntry>(Connection).ConfigureAwait(false);
5050
}
5151
}
5252

5353
/// <inheritdoc/>
5454
public async ValueTask CleanupAsync()
5555
{
56-
await TryConfigureIndexes();
57-
await EntityCommandWriter.WriteAsync<DbCachedEntry>(Connection, new[] { new CleanupCommand() }, default);
56+
await TryConfigureIndexes().ConfigureAwait(false);
57+
await EntityCommandWriter.WriteAsync<DbCachedEntry>(Connection, new[] { new CleanupCommand() }, default).ConfigureAwait(false);
5858
}
5959

6060
/// <inheritdoc/>
6161
public async ValueTask EvictAsync(string cacheKey)
6262
{
63-
await TryConfigureIndexes();
64-
await EntityCommandWriter.WriteAsync<DbCachedEntry>(Connection, new[] { new EvictCommand(cacheKey) }, default);
63+
await TryConfigureIndexes().ConfigureAwait(false);
64+
await EntityCommandWriter.WriteAsync<DbCachedEntry>(Connection, new[] { new EvictCommand(cacheKey) }, default).ConfigureAwait(false);
6565
}
6666

6767
/// <inheritdoc/>
6868
public async ValueTask FlushAsync()
6969
{
70-
await EntityCommandWriter.WriteAsync<DbCachedEntry>(Connection, new[] { new FlushCommand() }, default);
70+
await EntityCommandWriter.WriteAsync<DbCachedEntry>(Connection, new[] { new FlushCommand() }, default).ConfigureAwait(false);
7171
}
7272

7373
/// <inheritdoc/>
7474
public async ValueTask<CacheEntry<T>?> GetAsync<T>(string cacheKey)
7575
{
76-
await TryConfigureIndexes();
76+
await TryConfigureIndexes().ConfigureAwait(false);
7777

7878
var provider = new MongoFrameworkQueryProvider<DbCachedEntry>(Connection);
7979
var queryable = new MongoFrameworkQueryable<DbCachedEntry>(provider);
@@ -92,15 +92,15 @@ public async ValueTask FlushAsync()
9292
/// <inheritdoc/>
9393
public async ValueTask SetAsync<T>(string cacheKey, CacheEntry<T> cacheEntry)
9494
{
95-
await TryConfigureIndexes();
95+
await TryConfigureIndexes().ConfigureAwait(false);
9696
var command = new SetCommand(new DbCachedEntry
9797
{
9898
CacheKey = cacheKey,
9999
Expiry = cacheEntry.Expiry,
100100
Value = cacheEntry.Value!
101101
});
102102

103-
await EntityCommandWriter.WriteAsync<DbCachedEntry>(Connection, new[] { command }, default);
103+
await EntityCommandWriter.WriteAsync<DbCachedEntry>(Connection, new[] { command }, default).ConfigureAwait(false);
104104
}
105105

106106
/// <inheritdoc/>
@@ -110,7 +110,7 @@ public async ValueTask<bool> IsAvailableAsync(string cacheKey)
110110
{
111111
try
112112
{
113-
await TryConfigureIndexes();
113+
await TryConfigureIndexes().ConfigureAwait(false);
114114
IsDatabaseAvailable = true;
115115
}
116116
catch

src/CacheTower.Providers.Redis/RedisCacheLayer.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ public ValueTask CleanupAsync()
5252
/// <inheritdoc/>
5353
public async ValueTask EvictAsync(string cacheKey)
5454
{
55-
await Database.KeyDeleteAsync(cacheKey);
55+
await Database.KeyDeleteAsync(cacheKey).ConfigureAwait(false);
5656
}
5757

5858
/// <inheritdoc/>
@@ -65,14 +65,14 @@ public async ValueTask FlushAsync()
6565
var redisEndpoints = Connection.GetEndPoints();
6666
foreach (var endpoint in redisEndpoints)
6767
{
68-
await Connection.GetServer(endpoint).FlushDatabaseAsync(Options.DatabaseIndex);
68+
await Connection.GetServer(endpoint).FlushDatabaseAsync(Options.DatabaseIndex).ConfigureAwait(false);
6969
}
7070
}
7171

7272
/// <inheritdoc/>
7373
public async ValueTask<CacheEntry<T>?> GetAsync<T>(string cacheKey)
7474
{
75-
var redisValue = await Database.StringGetAsync(cacheKey);
75+
var redisValue = await Database.StringGetAsync(cacheKey).ConfigureAwait(false);
7676
if (redisValue != RedisValue.Null)
7777
{
7878
using var stream = new MemoryStream(redisValue);
@@ -101,7 +101,7 @@ public async ValueTask SetAsync<T>(string cacheKey, CacheEntry<T> cacheEntry)
101101
Options.Serializer.Serialize(stream, cacheEntry);
102102
stream.Seek(0, SeekOrigin.Begin);
103103
var redisValue = RedisValue.CreateFrom(stream);
104-
await Database.StringSetAsync(cacheKey, redisValue, expiryOffset);
104+
await Database.StringSetAsync(cacheKey, redisValue, expiryOffset).ConfigureAwait(false);
105105
}
106106
}
107107
}

src/CacheTower/CacheStack.cs

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -106,10 +106,10 @@ public async ValueTask FlushAsync()
106106
for (int i = 0, l = CacheLayers.Length; i < l; i++)
107107
{
108108
var layer = CacheLayers[i];
109-
await layer.FlushAsync();
109+
await layer.FlushAsync().ConfigureAwait(false);
110110
}
111111

112-
await Extensions.OnCacheFlushAsync();
112+
await Extensions.OnCacheFlushAsync().ConfigureAwait(false);
113113
}
114114

115115
/// <inheritdoc/>
@@ -120,7 +120,7 @@ public async ValueTask CleanupAsync()
120120
for (int i = 0, l = CacheLayers.Length; i < l; i++)
121121
{
122122
var layer = CacheLayers[i];
123-
await layer.CleanupAsync();
123+
await layer.CleanupAsync().ConfigureAwait(false);
124124
}
125125
}
126126

@@ -137,10 +137,10 @@ public async ValueTask EvictAsync(string cacheKey)
137137
for (int i = 0, l = CacheLayers.Length; i < l; i++)
138138
{
139139
var layer = CacheLayers[i];
140-
await layer.EvictAsync(cacheKey);
140+
await layer.EvictAsync(cacheKey).ConfigureAwait(false);
141141
}
142142

143-
await Extensions.OnCacheEvictionAsync(cacheKey);
143+
await Extensions.OnCacheEvictionAsync(cacheKey).ConfigureAwait(false);
144144
}
145145

146146
/// <inheritdoc/>
@@ -154,7 +154,7 @@ public async ValueTask<CacheEntry<T>> SetAsync<T>(string cacheKey, T value, Time
154154
}
155155

156156
var cacheEntry = new CacheEntry<T>(value, timeToLive);
157-
await InternalSetAsync(cacheKey, cacheEntry, CacheUpdateType.AddOrUpdateEntry);
157+
await InternalSetAsync(cacheKey, cacheEntry, CacheUpdateType.AddOrUpdateEntry).ConfigureAwait(false);
158158
return cacheEntry;
159159
}
160160

@@ -173,7 +173,7 @@ public async ValueTask SetAsync<T>(string cacheKey, CacheEntry<T> cacheEntry)
173173
throw new ArgumentNullException(nameof(cacheEntry));
174174
}
175175

176-
await InternalSetAsync(cacheKey, cacheEntry, CacheUpdateType.AddOrUpdateEntry);
176+
await InternalSetAsync(cacheKey, cacheEntry, CacheUpdateType.AddOrUpdateEntry).ConfigureAwait(false);
177177
}
178178

179179
private async ValueTask InternalSetAsync<T>(string cacheKey, CacheEntry<T> cacheEntry, CacheUpdateType cacheUpdateType)
@@ -184,15 +184,15 @@ private async ValueTask InternalSetAsync<T>(string cacheKey, CacheEntry<T> cache
184184

185185
try
186186
{
187-
await layer.SetAsync(cacheKey, cacheEntry);
187+
await layer.SetAsync(cacheKey, cacheEntry).ConfigureAwait(false);
188188
}
189189
catch (CacheSerializationException ex)
190190
{
191191
Logger.LogWarning(ex, "Unable to set CacheKey={CacheKey} on CacheLayer={CacheLayer} due to an exception. This will result in cache misses on this layer.", cacheKey, layer.GetType());
192192
}
193193
}
194194

195-
await Extensions.OnCacheUpdateAsync(cacheKey, cacheEntry.Expiry, cacheUpdateType);
195+
await Extensions.OnCacheUpdateAsync(cacheKey, cacheEntry.Expiry, cacheUpdateType).ConfigureAwait(false);
196196
}
197197

198198
/// <inheritdoc/>
@@ -208,11 +208,11 @@ private async ValueTask InternalSetAsync<T>(string cacheKey, CacheEntry<T> cache
208208
for (var layerIndex = 0; layerIndex < CacheLayers.Length; layerIndex++)
209209
{
210210
var layer = CacheLayers[layerIndex];
211-
if (await layer.IsAvailableAsync(cacheKey))
211+
if (await layer.IsAvailableAsync(cacheKey).ConfigureAwait(false))
212212
{
213213
try
214214
{
215-
var cacheEntry = await layer.GetAsync<T>(cacheKey);
215+
var cacheEntry = await layer.GetAsync<T>(cacheKey).ConfigureAwait(false);
216216
if (cacheEntry != default)
217217
{
218218
return cacheEntry;
@@ -234,11 +234,11 @@ private async ValueTask InternalSetAsync<T>(string cacheKey, CacheEntry<T> cache
234234
for (var layerIndex = 0; layerIndex < CacheLayers.Length; layerIndex++)
235235
{
236236
var layer = CacheLayers[layerIndex];
237-
if (await layer.IsAvailableAsync(cacheKey))
237+
if (await layer.IsAvailableAsync(cacheKey).ConfigureAwait(false))
238238
{
239239
try
240240
{
241-
var cacheEntry = await layer.GetAsync<T>(cacheKey);
241+
var cacheEntry = await layer.GetAsync<T>(cacheKey).ConfigureAwait(false);
242242
if (cacheEntry != default)
243243
{
244244
return (layerIndex, cacheEntry);
@@ -270,7 +270,7 @@ public async ValueTask<T> GetOrSetAsync<T>(string cacheKey, Func<T, Task<T>> val
270270
}
271271

272272
var currentTime = DateTimeProvider.Now;
273-
var cacheEntryPoint = await GetWithLayerIndexAsync<T>(cacheKey);
273+
var cacheEntryPoint = await GetWithLayerIndexAsync<T>(cacheKey).ConfigureAwait(false);
274274
var cacheEntryStatus = CacheEntryStatus.Stale;
275275
if (cacheEntryPoint != default)
276276
{
@@ -302,7 +302,7 @@ public async ValueTask<T> GetOrSetAsync<T>(string cacheKey, Func<T, Task<T>> val
302302
cacheEntryStatus = CacheEntryStatus.Miss;
303303
}
304304

305-
return (await RefreshValueAsync(cacheKey, valueFactory, settings, cacheEntryStatus))!.Value!;
305+
return (await RefreshValueAsync(cacheKey, valueFactory, settings, cacheEntryStatus).ConfigureAwait(false))!.Value!;
306306
}
307307

308308
private async ValueTask BackPopulateCacheAsync<T>(int fromIndexExclusive, string cacheKey, CacheEntry<T> cacheEntry)
@@ -314,9 +314,9 @@ private async ValueTask BackPopulateCacheAsync<T>(int fromIndexExclusive, string
314314
for (; --fromIndexExclusive >= 0;)
315315
{
316316
var previousLayer = CacheLayers[fromIndexExclusive];
317-
if (await previousLayer.IsAvailableAsync(cacheKey))
317+
if (await previousLayer.IsAvailableAsync(cacheKey).ConfigureAwait(false))
318318
{
319-
await previousLayer.SetAsync(cacheKey, cacheEntry);
319+
await previousLayer.SetAsync(cacheKey, cacheEntry).ConfigureAwait(false);
320320
}
321321
}
322322
}
@@ -333,7 +333,7 @@ private async ValueTask BackPopulateCacheAsync<T>(int fromIndexExclusive, string
333333
{
334334
try
335335
{
336-
var previousEntry = await GetAsync<T>(cacheKey);
336+
var previousEntry = await GetAsync<T>(cacheKey).ConfigureAwait(false);
337337
if (previousEntry != default && entryStatus == CacheEntryStatus.Miss && previousEntry.Expiry >= DateTimeProvider.Now)
338338
{
339339
//The Cache Stack will always return an unexpired value if one exists.
@@ -344,26 +344,26 @@ private async ValueTask BackPopulateCacheAsync<T>(int fromIndexExclusive, string
344344
return previousEntry;
345345
}
346346

347-
await using var distributedLock = await Extensions.AwaitAccessAsync(cacheKey);
347+
await using var distributedLock = await Extensions.AwaitAccessAsync(cacheKey).ConfigureAwait(false);
348348

349349
CacheEntry<T>? cacheEntry;
350350
if (distributedLock.IsLockOwner)
351351
{
352352
var oldValue = previousEntry != default ? previousEntry.Value : default;
353-
var refreshedValue = await asyncValueFactory(oldValue!);
353+
var refreshedValue = await asyncValueFactory(oldValue!).ConfigureAwait(false);
354354
cacheEntry = new CacheEntry<T>(refreshedValue, settings.TimeToLive);
355355
var cacheUpdateType = entryStatus switch
356356
{
357357
CacheEntryStatus.Miss => CacheUpdateType.AddEntry,
358358
_ => CacheUpdateType.AddOrUpdateEntry
359359
};
360-
await InternalSetAsync(cacheKey, cacheEntry, cacheUpdateType);
360+
await InternalSetAsync(cacheKey, cacheEntry, cacheUpdateType).ConfigureAwait(false);
361361

362362
KeyLock.ReleaseLock(cacheKey, cacheEntry);
363363
}
364364
else
365365
{
366-
cacheEntry = await GetAsync<T>(cacheKey);
366+
cacheEntry = await GetAsync<T>(cacheKey).ConfigureAwait(false);
367367
}
368368

369369
return cacheEntry;
@@ -377,15 +377,15 @@ private async ValueTask BackPopulateCacheAsync<T>(int fromIndexExclusive, string
377377
else if (entryStatus != CacheEntryStatus.Stale)
378378
{
379379
//Last minute check to confirm whether waiting is required
380-
var currentEntry = await GetAsync<T>(cacheKey);
380+
var currentEntry = await GetAsync<T>(cacheKey).ConfigureAwait(false);
381381
if (currentEntry != null && currentEntry.GetStaleDate(settings) > DateTimeProvider.Now)
382382
{
383383
KeyLock.ReleaseLock(cacheKey, currentEntry);
384384
return currentEntry;
385385
}
386386

387387
//Lock until we are notified to be unlocked
388-
return await KeyLock.WaitAsync(cacheKey) as CacheEntry<T>;
388+
return await KeyLock.WaitAsync(cacheKey).ConfigureAwait(false) as CacheEntry<T>;
389389
}
390390

391391
return default;
@@ -410,11 +410,11 @@ public async ValueTask DisposeAsync()
410410
}
411411
else if (layer is IAsyncDisposable asyncDisposableLayer)
412412
{
413-
await asyncDisposableLayer.DisposeAsync();
413+
await asyncDisposableLayer.DisposeAsync().ConfigureAwait(false);
414414
}
415415
}
416416

417-
await Extensions.DisposeAsync();
417+
await Extensions.DisposeAsync().ConfigureAwait(false);
418418

419419
Disposed = true;
420420
}

src/CacheTower/CacheStack{TContext}.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ public async ValueTask<T> GetOrSetAsync<T>(string cacheKey, Func<T, TContext, Ta
5757
{
5858
using var scope = CacheContextActivator.BeginScope();
5959
var context = (TContext)scope.Resolve(typeof(TContext));
60-
return await getter(old, context);
61-
}, settings);
60+
return await getter(old, context).ConfigureAwait(false);
61+
}, settings).ConfigureAwait(false);
6262
}
6363
}

0 commit comments

Comments
 (0)