using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using NeoSmart.AsyncLock; using ServerCore; using ServerBase; using MASTER_GUID = System.String; namespace ServerBase; public class EntityTransactionRunnerWithScopLock : IDisposable { private readonly EntityBase m_owner; private readonly MASTER_GUID m_transact_master_guid; public EntityTransactionRunnerWithScopLock(EntityBase owner, string transactMasterGuid = "") { m_owner = owner; m_transact_master_guid = transactMasterGuid; } public void Dispose() { if (m_transact_master_guid.isNullOrWhiteSpace()) { return; } var master_guid = m_owner.getMasterGuid(); if (m_transact_master_guid != master_guid) { Log.getLogger().error($"Not matched MasterGuid !!! - attachedMasterGuid:{master_guid} == settedMasterGuid:{m_transact_master_guid}"); return; } m_owner.detachMasterGuid(); } public async Task tryInvokeWithAsyncLock(Func> func) { var owner = getOwner(); NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!"); var result = default(T); var err_msg = string.Empty; using (var releaser = await m_owner.getAsyncLock()) { err_msg = $"AsyncLock() Start !!! - {m_owner.toBasicString()}"; Log.getLogger().debug(err_msg); if(false == m_transact_master_guid.isNullOrWhiteSpace()) { ConditionValidCheckHelper.throwIfFalseWithCondition( () => true == m_owner.attachMasterGuid(m_transact_master_guid) , () => $"Failed to attach Master !!! : transactMasterGuid:{m_transact_master_guid} - {owner.toBasicString()}"); } result = await func(); err_msg = $"AsyncLock() End !!! - {m_owner.toBasicString()}"; Log.getLogger().debug(err_msg); } return result; } public EntityBase getOwner() => m_owner; }