现在我正在尝试锁定AppFabric Cache中的项目,我想保持锁定直到我的工作完成,所以我需要告诉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。这让我无法知道我是否仍然拥有锁,因为如果该锁由另一个客户端拥有,则该异常与当前的一个相同。 有没有人有解决方案来解决问题?
提前谢谢。
答案 0 :(得分:1)
在悲观并发模型中,客户端显式锁定对象以执行操作。当对象被锁定时,锁定句柄将作为输出参数返回,并且需要解锁对象。每个锁定对象只有一个唯一的句柄。
缓存中的锁定对象仍可由具有 Put 方法的任何缓存客户端替换,您可以使用获取获取项目。启用缓存的应用程序负责一致地使用 PutAndUnlock 来处理使用悲观并发模型的项目。
因此,在您的情况下,如果您想要增加锁定对象的锁定超时,您可以简单地再次使用相同的超时(由同一客户端,“锁定器”)放置相同的对象