問題:
非同步實體框架資料庫調用的效能明顯低於同步資料庫調用,執行時間通常增加十倍。 考慮這個例子:
<code class="language-csharp">// Retrieve albums var albums = await this.context.Albums .Where(x => x.Artist.ID == artist.ID) .ToListAsync();</code>
根本原因:
此效能問題源自於 EF 6 非同步實作中的缺陷。 在處理包含二進位列的資料表時,EF 錯誤地使用非順序資料擷取 (CommandBehavior.Default),而不是更有效率的順序存取 (CommandBehavior.SequentialAccess)。
雖然未來的 EF 版本預計會解決此問題,但解決方法是使用 TaskCompletionSource<T>
手動將同步操作包裝在非同步方法中。這繞過了 EF 低效的非同步實現。
非同步實體框架操作中的效能下降並不是非同步程式設計所固有的,而是 EF 6 實作中的特定錯誤。 使用手動非同步包裝器可以有效緩解此效能瓶頸並提高應用程式回應能力。
以上是為什麼我的實體框架非同步操作比同步慢 10 倍?的詳細內容。更多資訊請關注PHP中文網其他相關文章!