是否可以在实体框架中设置执行时间?



我有一个利用实体框架 6 的应用程序。对于相对较快的查询(例如,执行时间不到一分钟),它工作正常。

但是我有一个存储过程,它查询一个没有适当索引的表,因此执行查询所花费的时间在 55 到 63 秒之间。显然,索引表格会缩短时间,但不幸的是,我没有控制局势的奢侈,不得不处理我被处理的牌。

我看到的是,当 EF6 用于调用存储过程时,它会在不到 3 秒的总时间内继续通过代码并返回 0 条记录的结果;当我知道有 6 条记录时,SPROC 将直接在数据库中执行时返回。

没有任何错误,因此代码执行正常。

执行测试;我使用 SqlClient 库构造了一些代码并进行相同的调用,它返回了 6 条记录。另请注意,与 EF6 执行不同,它实际上需要几秒钟,就好像它实际上在等待接收响应一样。

在上下文中设置 CommandTimeout 似乎也没有任何区别,我怀疑可能是因为它没有超时,而是在继续代码之前没有等待结果?

我不记得在以前的版本中看到过这种行为,但话又说回来,执行我以前的查询所需的时间可能在 EF 的预期范围内

???有没有办法设置 EF 在继续执行代码之前等待响应的实际时间?或者有没有办法强制执行异步操作,因为它默认情况下似乎是默认的同步任务?还是代码中存在潜在缺陷?

演示(同步)执行的代码示例:无错误,但不返回任何记录

public static List<Orphan> GetOrphanItems()
{
try
{
using (var ctx = new DBEntities(_defaultConnection))
{
var orphanage =  from orp in ctx.GetQueueOrphans(null)
select orp;
var orphans = orphanage.Select(o => new Orphan
{
ServiceQueueId = o.ServiceQueueID,
QueueStatus = o.QueueStatus,
OrphanCode = o.OrphanCode,
Status = o.Status,
EmailAddress = o.EmailAddress,
TemplateId = o.TemplateId
}).ToList();
return orphans;
}
}
catch(Exception exc)
{
// Handle the error
}
}

使用 SqlClient 库(异步)的示例代码执行时间稍长,但返回 6 条记录

public static List<Orphan> GetOrphanItems()
{
long ServiceQueueId = 0;
bool QueueStatus;
var OrphanCode = String.Empty;
DateTime Status;
var EmailAddress = String.Empty;
int TemplateId = 0;
var orphans = new List<Orphan> ();
SqlConnection conn = new SqlConnection(_defaultConnection);   
try
{   
var cmdText = "EXEC dbo.GetQueueOrphans";
SqlCommand cmd = new SqlCommand(cmdText, conn);
conn.Open();
SqlDataReader reader;
reader = cmd.ExecuteReader();
while(reader.Read())
{
long.TryParse(reader["ServiceQueueId"].ToString(), out ServiceQueueId);
bool.TryParse(reader["QueueStatus"].ToString(), out QueueStatus);
OrphanCode = reader["OrphanCode"].ToString();
DateTime.TryParse(reader["Status"].ToString(), out Status);
EmailAddress = reader["EmailAddress"].ToString();
int.TryParse(reader["TemplateId"].ToString(), out TemplateId);
orphans.Add(new Orphan { ServiceQueueId = ServiceQueueId, QueueStatus=QueueStatus, OrphanCode=OrphanCode,
EmailAddress=EmailAddress, TemplateId=TemplateId});
}
conn.Close();
catch(Exception exc)
{
// Handle the error
}
finally
{
conn.Close();
}
}

检查执行方法的类型。

private async void MyMethod()
{
db.executeProdecudeAsync(); 
}

忘记在异步 void 方法中等待任务可能会导致所描述的行为,而没有任何智能感知警告。 修复:

private async Task MyMethod()
{
await db.executeProdecudeAsync(); 
}

或者,如果要在同步模式下运行,只需使用db.executeProdecudeAsync().Wait()

最新更新