C# 像这样覆盖SaveChanges和saveChangesSync安全吗?

C# 像这样覆盖SaveChanges和saveChangesSync安全吗?,c#,.net,asynchronous,entity-framework-core,C#,.net,Asynchronous,Entity Framework Core,我有一些围绕savechangesync方法执行的自定义逻辑。问题是,我有一些旧代码调用SaveChanges。我已经确定下面的代码可能是好的,但我担心任何可能的副作用(死锁)。我在尝试将异步调用转换为同步调用时遇到问题 class SomeDbContext : DbContext { public override async Task<int> SaveChangesAsync(CancellationToken cancellationToken = new Canc

我有一些围绕
savechangesync
方法执行的自定义逻辑。问题是,我有一些旧代码调用
SaveChanges
。我已经确定下面的代码可能是好的,但我担心任何可能的副作用(死锁)。我在尝试将异步调用转换为同步调用时遇到问题

class SomeDbContext : DbContext
{
    public override async Task<int> SaveChangesAsync(CancellationToken cancellationToken = new CancellationToken())
    {
        BeforeSaveChanges();
        var result = await base.SaveChangesAsync(cancellationToken);
        await DispatchDomainEvents();
        return result;
    }

    public override int SaveChanges()
    {
        return SaveChangesAsync().GetAwaiter().GetResult();
    }
}
class-SomeDbContext:DbContext
{
公共重写异步任务saveChangesSync(CancellationToken CancellationToken=new CancellationToken())
{
BeforeSaveChanges();
var result=await base.saveChangesSync(cancellationToken);
等待DispatchDomainEvents();
返回结果;
}
公共覆盖int SaveChanges()
{
返回savechangessync().GetAwaiter().GetResult();
}
}

您应该在sync
SaveChanges
方法中复制相同的实现:

class SomeDbContext : DbContext
{
    public override async Task<int> SaveChangesAsync(CancellationToken cancellationToken = new CancellationToken())
    {
        BeforeSaveChanges();
        var result = await base.SaveChangesAsync(cancellationToken);
        await DispatchDomainEvents();
        return result;
    }

    public override int SaveChanges()
    {
        BeforeSaveChanges();
        var result = base.SaveChanges();
        DispatchDomainEvents().Wait(); // Ideally, you should have a sync version for this method too
        return result;
    }
}
class-SomeDbContext:DbContext
{
公共重写异步任务saveChangesSync(CancellationToken CancellationToken=new CancellationToken())
{
BeforeSaveChanges();
var result=await base.saveChangesSync(cancellationToken);
等待DispatchDomainEvents();
返回结果;
}
公共覆盖int SaveChanges()
{
BeforeSaveChanges();
var result=base.SaveChanges();
DispatchDomainEvents().Wait();//理想情况下,此方法也应该有一个同步版本
返回结果;
}
}

在某些情况下,阻止当前线程等待异步方法完成可能会导致线程饥饿。

原始的
SaveChanges
看起来像什么?不,原因很多。对于初学者来说,阻止异步方法使其“同步”总是一个坏主意。那种
SaveChanges
方法似乎没有任何用处。另一个原因与额外的方法有关。他们是干什么的?DbContext是一个多实体的工作单元,它的任务是缓存有界上下文中的所有更改,并一次保存所有更改<代码>DispatchDomainEvents不是UoW或存储库问题。DbContext必须知道并绑定到与其功能无关的类job@LasseV.Karlsen,请参阅
我在尝试将异步调用转换为同步调用时遇到问题。
don;首先,我们不能这样做。通过在您自己的方法调用之间调用基方法,以实现异步版本的相同方式实现SaveChanges不是更有意义吗?