Azure のキャッシュ内のオブジェクトにペシミスティック コンカレンシー ロジックを実装しようとしています。以下は私がいじっているコードです:
public SyncObject GetOperatorSync(int operatorId)
{
DataCacheLockHandle handle = null;
SyncObject sync;
string key = OpPrefix + operatorId;
try
{
sync = (SyncObject) _cache.GetAndLock(key, _cacheTimeOut, out handle);
}
catch (DataCacheException ex)
{
if (ex.ErrorCode == DataCacheErrorCode.ObjectLocked)
{
return GetOperatorSync(operatorId);
}
throw;
}
finally
{
if (null != handle)
_cache.Unlock(key, handle);
}
return sync;
}
でその再帰呼び出しを行うのは好きではありませんcatch
が、 a をエミュレートするために考えられる他の唯一の方法lock
は、ブール値を false に設定してwhile
ループを実行することです。
このような:
public SyncObject GetOperatorSync(int operatorId)
{
DataCacheLockHandle handle = null;
SyncObject sync = null;
string key = OpPrefix + operatorId;
bool isLocked = true;
while (isLocked)
{
try
{
sync = (SyncObject)_cache.GetAndLock(key, _cacheTimeOut, out handle);
isLocked = false;
}
catch (DataCacheException ex)
{
if (ex.ErrorCode != DataCacheErrorCode.ObjectLocked)
{
throw;
}
}
finally
{
if (null != handle)
_cache.Unlock(key, handle);
}
}
return sync;
}