EF FirstOrDefaultAsync是真正的异步还是Task.Run包装器?

时间:2018-06-05 13:47:59

标签: c# entity-framework wcf asynchronous async-await

我很难决定我的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();
        }
    });    
}

Imho它没有意义,因为它可以在客户端完成。在这种情况下,你不要浪费主线程等待DB返回,但你获得了另一个线程来执行此操作。

所以..唯一的情况是,方法GetItemDetails async是有意义的是FirstOrDefault真正异步,我不必做Task.Run包装。我是对的吗?

如果是这样,问题是: FirstOrDefaultAsync 是真正的异步功能吗?如果没有,是否有任何真正的异步函数通过EF从DB(SQL Server)获取数据?

我正在使用EF6。

谢谢

0 个答案:

没有答案