我很难决定我的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。
谢谢