1

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;
    }
4

0 に答える 0