3

現在、AppFabric キャッシュ内のアイテムをロックしようとしていますが、作業が完了するまでロックを保持したいので、既にロックを所有しているときにロックがタイムアウトにならないように AppFabric に指示する必要があります。私の解決策は、すでにロックを所有している場合でも、同じアイテムを定期的にロックすることです。

while (true)
{
    try
    {
        String value = cacheClient.GetAndLock("key1", TimeSpan.FromSeconds(10), out lockHandle, true) as String;
        Console.WriteLine(value);
    }
    catch (DataCacheException e)
    {
        switch (e.ErrorCode)
        {
            case DataCacheErrorCode.KeyDoesNotExist:
                Console.WriteLine("Key not found");
                break;
            case DataCacheErrorCode.ObjectLocked:
                Console.WriteLine("Object Locked");
                break;
            default:
                Console.WriteLine("Others " + e.ErrorCode);
                break;
        }
    }
    Thread.Sleep(1000);
}

しかし、問題があります。コードは DataCacheException をスローしており、ErrorCode は ObjectLocked です。ロックが別のクライアントによって所有されている場合、例外は現在のものと同じであるため、ロックをまだ持っているかどうかを知ることができません。誰でも問題を解決する解決策を持っていますか?

前もって感謝します。

4

1 に答える 1

1

悲観的同時実行モデルでは、クライアントはオブジェクトを明示的にロックして操作を実行します。オブジェクトがロックされると、ロック ハンドルが出力パラメーターとして返され、オブジェクトのロックを解除するために必要になります。ロックされたオブジェクトごとに一意のハンドルが 1 つだけあります。

キャッシュ内のロックされたオブジェクトは、 Putメソッドを使用して任意のキャッシュ クライアントで置き換えることができ、 Getを使用して項目を取得できます。キャッシュ対応アプリケーションは、悲観的同時実行モデルを使用するアイテムに対してPutAndUnlockを一貫して使用する責任があります。

したがって、あなたの場合、ロックされたオブジェクトのロックタイムアウトを増やしたい場合は、同じタイムアウトで同じオブジェクトを再度置くことができます(同じクライアント、「ロッカー」による)

于 2012-10-01T10:09:42.983 に答える