78 lines
2.1 KiB
C#
78 lines
2.1 KiB
C#
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<T> tryInvokeWithAsyncLock<T>(Func<Task<T>> 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;
|
|
}
|