public static async Task<Ticket> AcquireTicket() { var count = _tickets.Count; #if DEBUG var totalWaitTime = 0; #endif while (_tickets.Count >= _maxTickets) { var waitTime = (int)_waitTime + 1; #if DEBUG totalWaitTime += waitTime; #endif await Task.Delay(waitTime); } #if DEBUG if (totalWaitTime > 0) { System.Diagnostics.Debug.WriteLine("Had to wait for a ticket for a total of " + totalWaitTime + " ms"); } #endif Ticket ticket = new Ticket(_index++, DateTime.Now); _tickets.Add(ticket); return ticket; }
public static void ReleaseTicket(Ticket ticket) { var timespan = (long)(DateTime.Now - ticket.Timestamp).TotalMilliseconds; var waitTime = (_waitTime + timespan) / 2; #if DEBUG System.Diagnostics.Debug.WriteLine("Ticket " + ticket.Id + " was reserved for " + waitTime + " ms"); #endif _tickets.Remove(ticket); _waitTime = _tickets.Count > 0 ? waitTime : 0; }