向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的建议。

提前感谢您的帮助。

向SaveChangesAsync添加一些额外的工作

在Task中封装同步方法。运行并调用它TheOriginalMethodAsync是常见的代码气味

DoExtraWork()是否是一个CPU绑定操作,您希望在当前线程发生时释放它?如果是,则将其重构为内联:

var extraWorkRes = await Task.Run<int>(() => this.DoExtraWork());

如果没有,只需直接调用:

var extraWorkRes = this.DoExtraWork();

是否需要SaveChanges之外的DoExtraWork的结果?如果没有,你不需要分配它。

如果这是你的真实代码,还请注意,你错过了Task.Run的最后一个括号。其他一切对我来说都很好。当你运行它时,它会遇到任何问题吗?还是你只是为了理智而检查?