问题:
异步实体框架数据库调用的性能明显低于同步数据库调用,执行时间通常增加十倍。 考虑这个例子:
<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中文网其他相关文章!