問題:
非同期 Entity Framework データベース呼び出しは、同期呼び出しに比べてパフォーマンスが大幅に低下し、実行時間が 10 倍に増加することがよくあります。 次の例を考えてみましょう:
<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.SequentialAccess) ではなく、非順次データ取得 (CommandBehavior.Default) を誤って採用します。
将来の EF バージョンではこの問題に対処する予定ですが、回避策としては、TaskCompletionSource<T>
を使用して非同期メソッド内に同期操作を手動でラップする必要があります。これにより、EF の非効率な非同期実装が回避されます。
非同期 Entity Framework 操作のパフォーマンスの低下は、非同期プログラミングに固有のものではなく、EF 6 の実装における特定のバグです。 手動の非同期ラッパーを採用すると、このパフォーマンスのボトルネックが効果的に軽減され、アプリケーションの応答性が向上します。
以上がEntity Framework の非同期操作が同期操作より 10 倍遅いのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。