Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 向SaveChangesSync添加一些额外的工作_C#_Entity Framework 6 - Fatal编程技术网

C# 向SaveChangesSync添加一些额外的工作

C# 向SaveChangesSync添加一些额外的工作,c#,entity-framework-6,C#,Entity Framework 6,我必须向数据库上下文SaveChanges方法添加一些额外的工作。我需要在base.SaveChanges()方法之后完成这项工作,因为在将记录添加到数据库之后,我需要记录ID。我的SaveChanges方法的概要如下所示(需要两个try..catch块来将保存的db更改与其他操作隔离开来): 我的问题是savechangesync方法,因为我对.NET任务没有太多经验,也不知道是否正确覆盖了它 public override async Task<int> SaveChanges

我必须向数据库上下文
SaveChanges
方法添加一些额外的工作。我需要在base.SaveChanges()方法之后完成这项工作,因为在将记录添加到数据库之后,我需要记录ID。我的SaveChanges方法的概要如下所示(需要两个
try..catch
块来将保存的db更改与其他操作隔离开来):

我的问题是
savechangesync
方法,因为我对.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));
 }
public override异步任务saveChangesSync(CancellationToken CancellationToken)
{
使用(var scope=new TransactionScope())
{
var结果=0;
尝试
{
结果=wait base.saveChangesSync(cancellationToken);
}
捕获(例外情况除外)
{
//日志上下文异常
投掷;
}
尝试
{
//做一些额外的工作
var extraWorkRes=等待DoExtraWorkAsync(cancellationToken);
}
捕获(例外情况除外)
{
//日志异常
投掷;
}
scope.Complete();
返回结果;
}
}
私有任务DoExtraWorkAsync(CancellationToken CancellationToken)
{
返回Task.Run(()=>this.DoExtraWork(cancellationToken));
}
我需要帮助,一些建议如何正确覆盖
savechangesync


提前感谢您的帮助。

在任务中包装同步方法。运行并调用它TheOriginalMethodAsync是常见的代码味道

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

var extraWorkRes = await Task.Run<int>(() => this.DoExtraWork());
您是否需要保存更改之外的DoExtrawWork结果?如果没有,则不需要分配它


如果这是您的真实代码,还请注意您错过了Task.Run中的结束括号。我觉得其他一切都很好。运行它时是否遇到任何问题,或者只是为了检查是否正常?

这些只是我实际方法的草图,进一步处理了
DoExtraWork
方法的结果,但为了清楚起见,这里省略了。您能告诉我更多关于为什么您认为以我的方式制作异步版本的
DoExtraWork
,是一种代码味道吗?编辑:在
DoExtraWork
中,我向数据库写入了一些数据。当您调用一个方法DoSomethingAsync()时,您告诉使用该方法的程序员,该方法内容的自然状态是异步运行的。如果该方法所做的只是在Task.Run中包装一个现有的同步方法,那么您就增加了工作量,模糊了代码的含义。使用Task是最佳做法。当您需要为某些同步代码派生任务时,请直接运行。如果DoextrawWork()正在调用异步方法,请使DoextrawWork()返回任务并将其标记为async,重命名该方法DoextrawOrksync(),并在其中等待您调用的所有异步方法。您可以像现在这样等待它,但它会更干净,避免Task.Run(),并遵循异步调用(如写入数据库)方法所期望的async/await的传播。实际上,编写一个DoextrawWork的异步版本,使用DoextrawWork调用的所有异步版本。
var extraWorkRes = await Task.Run<int>(() => this.DoExtraWork());
var extraWorkRes = this.DoExtraWork();