所以..這可能是一個愚蠢的問題。使用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