向SaveChangesAsync添加一些额外的工作
本文关键字:工作 SaveChangesAsync 添加 | 更新日期: 2023-09-27 18:29:58
我必须为数据库上下文SaveChanges
方法添加一些额外的工作。我需要这项工作在基地后完成。SaveChanges()方法,因为我需要将记录添加到数据库后的ID。我的SaveChanges方法的概要如下(需要两个try..catch
块来将保存数据库更改与其他操作隔离开来):
public override int SaveChanges()
{
using (var scope = new TransactionScope())
{
var result = 0;
try
{
result = base.SaveChanges();
}
catch (Exception ex)
{
//Log context exception
throw;
}
try
{
//do some extra work
var extraWorkRes = DoExtraWork();
}
catch (Exception ex)
{
//Log exception
throw;
}
scope.Complete();
return result;
}
}
我的问题是SaveChangesAsync
方法,因为我对.NET任务没有太多经验,也不知道我是否正确地重写了它。
public override async Task<int> SaveChangesAsync(CancellationToken cancellationToken)
{
using (var scope = new TransactionScope())
{
var result = 0;
try
{
result = await base.SaveChangesAsync(cancellationToken);
}
catch (Exception ex)
{
//log context exception
throw;
}
try
{
//do some extra work
var extraWorkRes = await DoExtraWorkAsync(cancellationToken);
}
catch (Exception ex)
{
//Log exception
throw;
}
scope.Complete();
return result;
}
}
private Task<int> DoExtraWorkAsync(CancellationToken cancellationToken)
{
return Task.Run<int>(() => this.DoExtraWork(cancellationToken));
}
我需要帮助,一些关于如何正确覆盖SaveChangesAsync
的建议。
提前感谢您的帮助。
在Task中封装同步方法。运行并调用它TheOriginalMethodAsync是常见的代码气味。
DoExtraWork()是否是一个CPU绑定操作,您希望在当前线程发生时释放它?如果是,则将其重构为内联:
var extraWorkRes = await Task.Run<int>(() => this.DoExtraWork());
如果没有,只需直接调用:
var extraWorkRes = this.DoExtraWork();
是否需要SaveChanges之外的DoExtraWork的结果?如果没有,你不需要分配它。
如果这是你的真实代码,还请注意,你错过了Task.Run的最后一个括号。其他一切对我来说都很好。当你运行它时,它会遇到任何问题吗?还是你只是为了理智而检查?