private readonly TimeSpan MAX_RESERVATION = new TimeSpan(0, 0, 0, 1, 0);
...
         public Guid Reserve(Guid sagaId)
         {
            try
            {
               Rwl.TryWLock();
               RemoveExpiredReservations();
               var isReserved = Allocator.TryPinResource(localUri, sagaId);
               if (!isReserved)
                  return Guid.Empty;

               OpenReservations[sagaId] = DateTimeOffset.Now + MAX_RESERVATION;
               return sagaId;
            }
            finally
            {
               Rwl.ExitWLock();
            }
        }

        private void RemoveExpiredReservations()
        {
           var reftime = DateTimeOffset.Now;
           var ids = from item in OpenReservations where item.Value < reftime select item.Key;
           if (ids.Count() == 0) return;
           var keys=ids.ToArray();
           foreach (var id in keys)
           {
              OpenReservations.Remove(id);
              Allocator.FreePinnedResources(id);
           }

        }
