Является ли EF FirstOrDefaultAsync настоящей асинхронной оболочкой или программой Task.Run? - PullRequest
0 голосов
/ 05 июня 2018

Мне трудно решить, должен ли мой сервис 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.

Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...