Мне трудно решить, должен ли мой сервис WCF быть асинхронным или нет (я не имею в виду клиентскую Task.Run
оболочку, я имею в виду серверные контракты).Из того, что я прочитал, сервис должен быть асинхронным, если он вызывает действительно асинхронные функции, в противном случае он считается анти-шаблоном (фактически снижает производительность).
Например, я считаю это анти-шаблоном:
public async Task<ItemDto> GetItemDetails(int id)
{
return await Task.Run(() =>
{
using (var test = ContextFactory.CreateTestContext())
{
return test.TableA.AsNoTracking()
.Include(i => i.TableB)
.Include(i => i.TableC)
.Where(i => i.Id == id)
.Select(row => new ItemDto()
{
Id = row.id,
})
.FirstOrDefault();
}
});
}
Имхо это не имеет смысла, потому что это можно сделать на стороне клиента.В этом случае вы не тратите основной поток на ожидание возврата БД, а приобретаете для этого другой поток.
Итак ... единственный сценарий, когда метод GetItemDetails
async имеет смысл, этокогда FirstOrDefault
действительно асинхронный, и мне не нужно делать Task.Run
упаковщик.Я прав?
Если это так, вопрос: действительно ли FirstOrDefaultAsync действительно асинхронная функция?Если нет, есть ли действительно асинхронная функция для извлечения данных из БД (SQL Server) через EF?
Я использую EF6.
Спасибо