【发布时间】:2016-02-09 12:37:07
【问题描述】:
在我的代码中,我曾经使用 await FindAsync 加载相关实体,希望我能更好地符合 c# 异步准则。
var activeTemplate = await exec.DbContext
.FormTemplates.FindAsync(exec.Form.ActiveTemplateId);
它运行缓慢,在 sql server profiler 中很慢,在 SSMS 中查询文本很快。获取此行需要 5 秒。
替代方案:
var activeTemplate = exec.Form.ActiveTemplate;
更快。 无论如何,问题似乎不在于参数嗅探,因为快速和慢速查询中的读取次数是相同的。
一个可能不相关的点是获取的对象包含一个包含约 1MB 文本的字符串属性。应用是asp.net mvc,和sql server在同一台电脑上运行,使用(本地)连接。
观察到的缓慢的原因是什么?
编辑:@jbl 发表评论后,我又做了一些实验:
var activeTemplate = await exec.DbContext.FormTemplates
.FirstOrDefaultAsync(x => x.Id == exec.Form.ActiveTemplateId); // slow
var activeTemplate = exec.DbContext.FormTemplates
.FirstOrDefault(x => x.Id == exec.Form.ActiveTemplateId); // fast
【问题讨论】:
-
谢谢,奇怪的是,这不是答案:请看编辑
-
在这里查看答案,可能是你的情况:stackoverflow.com/questions/28543293/…
-
带有 VARCHAR(MAX) 的数据库在异步模式下由于某种原因速度很慢
-
好像真的是这样!谢谢
标签: c# sql-server performance entity-framework async-await