代码之家  ›  专栏  ›  技术社区  ›  Quark Soup

同步原语在处理异步/等待调用时是否无用?

  •  0
  • Quark Soup  · 技术社区  · 6 年前

    我相信所有基于线程的同步原语在隐式事务中都是无用的。鉴于班级:

    public class Country : IEnlistNotification
    {
      public ReaderWriterLockSlim Lock { get; } = new ReaderWriterLockSlim();
      public void Commit(Enlistment enlistment)
      {
          this.Lock.ExitWriteLock();
      }
    }
    

    我有以下代码:

    using (TransactionScope transactionScope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled))
    {
      Country country = new Country();
      Transaction.Current.EnlistVolatile(country, EnlistmentOptions.None);
      country.Lock.EnterWriteLock();
    
      await dbContext.Countries.AddAsync(newCountry).ConfigureAwait(true);
      await dbContext.SaveChangesAsync().ConfigureAwait(true);
    
      transactionScope.Complete();
    }
    

    问题是,即使使用 配置等待(真) ,不能保证返回同一线程。因此,当事务可以在不同的线程上完成时,当它调用易失性资源的提交或回滚方法以及退出锁的时间时,它(通常)在不同的线程上,而不是当您进入锁时。

    完全没有办法开锁,你很快就被锁上了。在利用async/await模式的体系结构中,readerwriterlockslim和其他原语似乎是非常无用的。我是不是漏掉了一些显而易见的东西?

    0 回复  |  直到 6 年前