static void Main(string[] args) { Timer t = new Timer { Interval = TimeSpan.FromMilliseconds(500) }; // 4 a. t.Expired += OntimerExpired; // 4 b. // da anonyme methode -> kann nicht mehr dereferenziert werden //t.Expired += // signaledTime => Console.WriteLine($"Timer expired at {signaledTime:HH:mm:ss:ff} "); // 4 c. // workaround ExpiredEventHandler handler = signaledTime => Console.WriteLine($"Timer expired at {signaledTime:HH:mm:ss:ff} "); t.Expired += handler; t.Start(); Console.ReadLine(); // statische Methode deshalb wäre es egal mit Memory Leaks // Expired hat eine Referenz gespeichert, deshalb wird es vom GC nicht freigegeben // 5 a. // t.Expired -= OntimerExpired; // 5 b. // unmöglich zu dereferenzieren // 5 c. t.Expired -= handler; }
private static DateTime ExpireFromDictionary(IDictionary <TKey, TValue> dict, TimeSpan maxAge, DateTime latestTime, ExpiredEventHandler handler) { var oldestUnexpired = DateTime.MaxValue; var removeList = new List <TKey>(); foreach (var kvp in dict) { if (latestTime - kvp.Value.LastModified > maxAge) { removeList.Add(kvp.Key); handler(kvp.Value); } else if (oldestUnexpired > kvp.Value.LastModified) { oldestUnexpired = kvp.Value.LastModified; } } foreach (var key in removeList) { dict.Remove(key); } return(oldestUnexpired); }
/// <summary> /// Constructor. /// </summary> /// <param name="maximumIncompleteRecordAge"> /// Maximum age for incomplete records before expiration. Must be non-zero. Negative values are converted to /// positive values. /// </param> /// <param name="maximumCompleteRecordAge"> /// Maximum age for complete records before expiration. Must be non-zero. Negative values are converted to /// positive values. /// </param> /// <param name="incompleteExpiredEventHandler">Method to handle expired incomplete records. Must not be null</param> /// <param name="completeExpiredEventHandler">Method to handle expired complete records. Must not be null</param> public ExpiringCompositeEventCollection(TimeSpan maximumIncompleteRecordAge, TimeSpan maximumCompleteRecordAge, ExpiredEventHandler incompleteExpiredEventHandler, ExpiredEventHandler completeExpiredEventHandler) { if (maximumIncompleteRecordAge == TimeSpan.Zero) { throw new ArgumentException("Timespan must be non-zero", "maximumIncompleteRecordAge"); } if (maximumCompleteRecordAge == TimeSpan.Zero) { throw new ArgumentException("Timespan must be non-zero", "maximumCompleteRecordAge"); } if (incompleteExpiredEventHandler == null) { throw new ArgumentNullException("incompleteExpiredEventHandler"); } if (completeExpiredEventHandler == null) { throw new ArgumentNullException("completeExpiredEventHandler"); } this.maxIncompleteAge = maximumIncompleteRecordAge.Duration(); this.maxCompleteAge = maximumCompleteRecordAge.Duration(); this.incompleteExpiredEventHandler = incompleteExpiredEventHandler; this.completeExpiredEventHandler = completeExpiredEventHandler; }
static void Main(string[] args) { Timer timer = new Timer { Interval = 0_500 }; ExpiredEventHandler expiredEvent = dateTime => Console.WriteLine($"Timer elapsed on {dateTime:HH:mm:ss.fff}"); timer.Expired += expiredEvent; timer.Expired += expiredEvent; timer.Expired -= expiredEvent; //timer.Expired += Timer_Expired; timer.Start(); }