Task.FromResult на GetAll с фильтром и ожиданием его - плохая практика? - PullRequest
0 голосов
/ 24 марта 2020

Я ищу способ сделать GetAll asyn c в приложении с фильтром и не блокировать пользователей до тех пор, пока не загрузится:

Вот что я сделал до сих пор;

Это обобщенный c метод в моем dbrepository.

public Task<IQueryable<TEntity>> GetAll(Expression<Func<TEntity, bool>> filter = null)
{
    return Task.FromResult(filter != null ? dbContext.Set<TEntity>().Where(filter) : dbContext.Set<TEntity>());
}

Затем я вызываю обобщенный c dbrepository в моем менеджере crud

public virtual async Task<IEnumerable<TEntityDto>> GetAll(Expression<Func<TEntity, bool>> filter = null)
{
    return (await repository.GetAll(filter)).Select(i => mapper.Map<TEntityDto>(i)).ToList();
}

Я прочитал эту статью, что ждать Task.FromResult как плохую практику, так как он только добавляет накладные расходы на конечный автомат.

http://www.tugberkugurlu.com/archive/should-i-await-on-task-fromresult-method-calls

Насколько я понимаю, мне нужно сделать этот синтаксис c, но тогда, если пользователи ждут это чтобы загрузить это заблокирует их.

Как мне справиться с этим?

1 Ответ

3 голосов
/ 24 марта 2020

Не заставляйте ваши методы выглядеть асинхронными c, когда их на самом деле нет.

Ничего в вашем dbrepository GetAll метод не является асинхронным; вы просто оборачиваете синхронную операцию в Task без необходимости.

Если пользователи обеспокоены блокировкой, это должно быть их решение запустить вызов метода в отдельном потоке.

...