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

在悲观并发模型中,客户端显式锁定对象以执行操作。当对象被锁定时,锁定句柄作为输出参数返回,并且是解锁对象所必需的。每个锁定的对象只有一个唯一的句柄。

缓存中的锁定对象仍然可以使用Put方法被任何缓存客户端替换,并且您可以使用Get获取项目。启用缓存的应用程序负责始终将PutAndUnlock用于使用悲观并发模型的项目。

因此,在您的情况下,如果您想增加锁定对象的锁定超时,您可以简单地再次放置具有相同超时的相同对象(由同一个客户端,“储物柜”)

于 2012-10-01T10:09:42.983 回答