【问题标题】:EF6 ToListAsync does not run async but blocks the threadEF6 ToListAsync 不运行异步但阻塞线程
【发布时间】:2015-07-08 08:57:12
【问题描述】:

为了提高页面性能,我想异步运行一些查询。
我升级到 EF6 是因为它通过公开异步方法本机支持此功能。
我无法同时触发查询,所以我将代码简化为这个简单的示例:

var sw = new Stopwatch();
sw.Start(); 
var dummy = context.Set<CA_Event_Person>().Take(200).ToListAsync();
sw.Stop();
Logger.Debug("attempt nr 1 : " + sw.ElapsedMilliseconds);
var result = await dummy;

我的例外是秒表会立即停止,因为我稍后会等待。
然而,我的记录器说秒表上已经过去了 5000 毫秒,这意味着调用是同步执行的,而不是异步的。

有人对我可能做错的原因或原因有所了解吗?

【问题讨论】:

  • EF 背后是什么数据库?因为,例如,SQL Compact 位不支持异步,所以会阻塞。
  • 我使用的是 SQL Server 2008

标签: c# entity-framework asynchronous async-await ef-database-first


【解决方案1】:

有人对我做错的原因或原因有所了解吗?

这是应用程序中对 EF 的第一次调用吗?您能否安排一次性构建 EF 模型的内部表示?

对于更复杂的 EF 模型,第一次调用会产生大量开销。但这是一次性(每个应用程序域)费用。

最好为多次通话计时(然后扔掉最短和最长的时间)。

【讨论】:

  • 我也发现了这个建议,但不,这不是我请求中的第一个电话。
  • 另外,根据我拍摄的大小,持续时间会增加或减少。我还有一个计时器来计时我的等待线,该计时器的持续时间约为 1 毫秒。
  • 如果您在上下文中使用DbSet&lt;T&gt; 属性,您会得到同样的结果吗? (如果没有(短)重新创建,将会有很多猜测。)
  • 刚刚尝试了 DBSet 属性,它给出了相同的结果。我会尝试创建一个小项目来模拟问题,但没有公共 sql 服务器可能会让思考变得困难 :)
  • 在创建我的演示项目时,您的答案似乎很准确,上下文生成是查询的最大部分。这不是第一个数据库调用,但它是该上下文中的第一个数据库调用(我有多个)。在第一个 toListAsync 之后,下一个任务会在 1 毫秒内生成。我做了一些进一步的研究,显然异步方法只会在第一个等待语句之后将自身作为任务返回(这有点奇怪,但确实解释了这种行为)
猜你喜欢
  • 2016-12-16
  • 1970-01-01
  • 2019-01-08
  • 2017-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-12
相关资源
最近更新 更多