我需要尝试锁定一个对象,如果它已经被锁定,只需继续(在超时后,或者没有它)。
C# lock语句正在阻塞。
发布于 2008-08-12 06:29:24
我相信你可以使用Monitor.TryEnter()
。
lock语句只是转换为一个Monitor.Enter()
调用和一个try catch
块。
发布于 2008-08-12 06:37:34
艾德为你准备了合适的功能。别忘了给Monitor.Exit()
打电话。您应该使用try-finally
块来保证正确的清理。
if (Monitor.TryEnter(someObject))
{
try
{
// use object
}
finally
{
Monitor.Exit(someObject);
}
}
发布于 2014-05-19 08:22:30
我也遇到了同样的问题,我最终创建了一个实现IDisposable的类TryLock
,然后使用using
语句来控制锁的范围:
public class TryLock : IDisposable
{
private object locked;
public bool HasLock { get; private set; }
public TryLock(object obj)
{
if (Monitor.TryEnter(obj))
{
HasLock = true;
locked = obj;
}
}
public void Dispose()
{
if (HasLock)
{
Monitor.Exit(locked);
locked = null;
HasLock = false;
}
}
}
然后使用以下语法锁定:
var obj = new object();
using (var tryLock = new TryLock(obj))
{
if (tryLock.HasLock)
{
Console.WriteLine("Lock acquired..");
}
}
https://stackoverflow.com/questions/8546
复制相似问题