使用EF6异步更新数据库,内部任务.是否运行?性能问题

本文关键字:运行 是否 性能 问题 任务 内部 异步 EF6 更新 数据库 使用 | 更新日期: 2023-09-27 17:57:55

我有一个WCF服务器应用程序,它应该接受来自客户端的调用,在数据库中更新并向客户端返回响应。对客户端的响应在数据库更新的结果中是独立的,更新中的异常对响应没有影响。我使用的是EF6异步方法。我可以使用Task.Run和内部调用异步方法:

 public Boolean Init(){
    //do something 
         Task.Run(async () =>  await UpdateDBAsync().ConfigureAwait(false))
                  .ContinueWith(res => _logger.Warn("cannot insert session to DB"),
                         TaskContinuationOptions.OnlyOnFaulted);
    //do some more
    return true;
}

以上内容将确保对客户端的响应将是即时的,并且不会依赖于DB响应时间。第二种方法是不使用任务。运行:

 public Boolean Init(){
    //do something 
     UpdateDBAsync().ContinueWith(res => _logger.Warn("cannot insert session to DB"),
                         TaskContinuationOptions.OnlyOnFaulted);
    //do some more
    return true;
}

第一种方法将分配一个线程池线程,而第二种方法将在当前线程上运行。我的主要目标是对客户端的响应将尽可能快,我的问题是第一种方法(使用Task.Run)会更快,还是线程池线程的创建会降低应用程序的整体性能,使响应更慢。注意:在第二种方法中,我使用ContinueWith(),而不是等待,因为我想做更多的事情并返回一个响应

编辑

UpdateDBAsync方法:

    public async Task UpdateDBAsync()
    {
        using (var context = SqlConnectionProvider.GetSqlDbEntityContext())
        {
            try
            {
                await _retryPolicy.ExecuteAsync(() => context.SaveChangesAsync());
            }
            catch (DbUpdateException ex)
            {
            }
        }
    } 

使用EF6异步更新数据库,内部任务.是否运行?性能问题

两者在功能上是相同的,只需要占用线程池线程调度的额外时间就可以完成工作,所以是的,它显然会更慢。它可能不会慢很多,但会慢一些。

唯一真正可能的例外是,如果UpdateDBAsync实际上不是异步的,并且实际上同步地执行了一系列工作,而不管它的名称如何。只要这个名字不是谎言,就没有理由在这里使用Task.Run