Skip to content

Instantly share code, notes, and snippets.

@davybrion
Created September 3, 2012 19:04
Show Gist options
  • Select an option

  • Save davybrion/3612440 to your computer and use it in GitHub Desktop.

Select an option

Save davybrion/3612440 to your computer and use it in GitHub Desktop.
code snippets for "Easy Non-Blocking Locking" post
public struct TimedLock : IDisposable
{
private readonly object target;
private TimedLock(object o)
{
target = o;
}
public void Dispose()
{
Monitor.Exit(target);
}
public static TimedLock Lock(object o)
{
return Lock(o, TimeSpan.FromSeconds(5));
}
public static TimedLock Lock(object o, TimeSpan timeout)
{
return Lock(o, timeout.Milliseconds);
}
public static TimedLock Lock(object o, int milliSeconds)
{
var timedLock = new TimedLock(o);
if (!Monitor.TryEnter(o, milliSeconds))
{
throw new LockTimeoutException();
}
return timedLock;
}
}
public class LockTimeoutException : ApplicationException
{
public LockTimeoutException() : base("Timeout waiting for lock") {}
}
public virtual T Get(Id id)
{
lock(MonitorObject)
{
if (!Members.ContainsKey(id))
{
return null;
}
return Members[id];
}
}
public virtual T Get(Id id)
{
using (TimedLock.Lock(MonitorObject, 250))
{
if (!Members.ContainsKey(id))
{
return null;
}
return Members[id];
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment