c# - Entity Framework 中可以设置执行时间吗?

标签 c# entity-framework

我有一个利用 Entity Framework 6 的应用程序。对于相对较快的查询(例如执行时间不到一分钟),它运行良好。

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

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

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

进行测试;我使用 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(); 
}

忘记在 async void 方法中等待任务可能会在没有任何 InteliSense 警告的情况下导致所描述的行为。 修复:

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

或者如果您想以同步模式运行,只需使用 db.executeProdecudeAsync().Wait()

关于c# - Entity Framework 中可以设置执行时间吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49368981/

相关文章:

c# - 在自引用表中预加载 Linq to SQL 实体

c# - 查询字符串和提取值的问题

c# - 如何在 C# 中向表中添加动态行

c# - 带有 Entity Framework 7 (rc1) 的全局表前缀

c# - 在 C# 中声明具有空集的属性

c# - Entity Framework 包括 Where

c# - 使用 C# 创建控制台应用程序以从 Azure 表存储读取数据

c# - 使用 Entity Framework 6 对多个对象进行 SQL 查询

c# - Entity Framework 批量插入虚幻缓慢

c# - 将字典从 Ajax 传递到 C# 代码隐藏