private FDMessageEnvelope MaybeReserveOne() { var qPath = FDMessageBus.GetQueuePath(_busName, _exchangeName, _queueName); foreach (var it in _messageNames) { if (_taken.Contains(it)) { continue; } var mmtx = FDMessageBus.GetMessageMutex(_exchangeName, _queueName, it); if (mmtx.Open()) { try { var fn = Path.Combine(qPath, it); var fi = new FileInfo(fn); _taken.Add(it); if (fi.Exists) { using (var sr = fi.OpenText()) { var text = sr.ReadToEnd(); var retval = JsonConvert.DeserializeObject <FDMessageEnvelope>(text, _serializerSettings); if (null != retval) { retval.Lock = mmtx; return(retval); } } } mmtx.Release(); } catch // not finally, because if we can open the message, control of the mutex passes // to the caller { mmtx.Release(); } } mmtx.Dispose(); } return(null); }