Мы столкнулись с ошибкой, из-за которой нам пришлось проверять список объектов с помощью асинхронного c метода. Автор кода хотел просто вставить его в выражение Linq следующим образом:
var invalidObjects = list
.Where(x => _service.IsValidAsync(x).Result)
.ToList();
Метод проверки выглядел примерно так:
public async Task<bool> IsValidAsync(object @object) {
var validObjects = await _cache.GetAsync<List<object>>("ValidObjectsCacheKey");
return validObjects.Contains(@object);
}
Это небольшое решение вызвало все приложение повесить на линию await _cache.GetAsync
. Кеш это распределённый кеш (redis). После изменения linq на простой foreach и надлежащего ожидания _service.IsValidAsync
код заработал без тупиков и практически мгновенно.
На базовом c уровне я понимаю, как работает async-await
, но не могу понять, почему это произошло, особенно потому, что в списке был только один объект.
Любое предложение Добро пожаловать!
РЕДАКТИРОВАТЬ: приложение работает на. net Core 2.2, но библиотека, в которой возникла проблема, ориентирована на .netstandard 2.0. System.Threading.SynchronizationContext.Current
возвращает ноль во время тупика
EDIT2: Оказывается, смена поставщика кэша (но все еще доступ к нему с помощью асинхронного c метода) также решает проблему, поэтому ошибка может быть клиент кэша Redis: https://github.com/aspnet/Caching/blob/master/src/Microsoft.Extensions.Caching.StackExchangeRedis/RedisCache.cs