所以..这可能是一个愚蠢的问题。使用EF6异步会提高性能VS在一个任务包同步EF6电话(假定数据库调用是一个Web API REST API方法内)异步EF 6 vs包装同步EF
即我不能让我的头完全围绕WHY,为什么是这样的:
//wrapping synch with asynch
return await Task.Run(() =>
{
var albums = this.context.Albums
.Where(x => x.Artist.ID == artist.ID)
.ToList();
return albums;
});
比这更糟糕:
//using async
return await this.context.Albums
.Where(x => x.Artist.ID == artist.ID)
.ToListAsync();
注:我有阅读这篇文章http://blogs.msdn.com/b/pfxteam/archive/2012/03/24/10287244.aspx这似乎是说(简单化)“不要只W¯¯说唱同步方法,更有效地重写方法“。
问题1,那是EF6的异步实现做了什么?我假设它在实现中使用异步I/O?
问题2(和我真正的问题) - 可以有人解释为什么这样比较好?在数据库操作完成之前,两种实现都不会导致释放请求线程来处理其他请求吗?
非常好的比喻。 – juharr
感谢您的回答和类比。说得通。但是,EF6异步方法(ToListAsync)*固有地*异步?是否因为他们在实现中使用异步I/O? – HokieMike
@HokieMike是的。就其本质而言,IO几乎总是异步的。几乎任何时候你看到同步IO方法都意味着,某个地方出于某种原因*会异步阻塞,直到异步通知表明它可以继续。许多IO操作的API都不愿意隐藏固有的异步;但现在它在C#中变得越来越常见,以便将异步地显示给调用者。 – Servy