在我的代码中,我曾经使用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服务器运行在同一台计算机上,并使用(本地)连接。

观察到的缓慢的原因是什么?

编辑:@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

最佳答案

从服务器读取较大的列(例如varbinary(MAX),varchar(MAX),nvarchar(MAX)或XML)时,异步方法可能会出现性能问题。

您可以找到rducom答案,该答案解释了异步方法here的问题

10-04 10:57