public void Release() { CallbackObject execute = null; if (Interlocked.Increment(ref this.counter) < 0) { if (!queue.TryDequeue(out execute)) { throw new NotImplementedException("ConcurrentQueue.TryDequeue failed"); } } else { if (counter > maxCounter) { throw new SemaphoreFullException("Release was called too many times"); } } if (execute != null) { execute.Callback(execute); execute.IsCompleted = true; } }
public void Release() { CallbackObject execute = null; lock (this) { if (!queue.Any()) { if (++counter > maxCounter) { throw new SemaphoreFullException("Release was called too many times"); } } else { execute = queue.Dequeue(); } } if (execute != null) { execute.Callback(execute); execute.IsCompleted = true; } }