使用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)
{
}
}
}
两者在功能上是相同的,只需要占用线程池线程调度的额外时间就可以完成工作,所以是的,它显然会更慢。它可能不会慢很多,但会慢一些。
唯一真正可能的例外是,如果UpdateDBAsync
实际上不是异步的,并且实际上同步地执行了一系列工作,而不管它的名称如何。只要这个名字不是谎言,就没有理由在这里使用Task.Run
。